Data preparation script for Sierra Nevada time series analysis

Merge templates with 14C, C, and N data

Radiocarbon analyses for the 2001 samples were not run originally, but were completed on archived samples in 2020.

2001 mean radiocarbon profiles

Fig. 10. Mean profile \(\Delta\)14C for 2001 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2001. Error bars show ±1 standard deviation, solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling.

2009 radiocarbon profiles

Fig. 10. Profile \(\Delta\)14C for 2009 samples

Caption: Profile \(\Delta\)14C by depth for each site in 2009. Solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling. Error bars not shown as only a single replicate profile was analyzed per site.

2019 mean radiocarbon profiles

Fig. 10. Mean profile \(\Delta\)14C for 2019 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2019. Error bars show ±1 standard deviation, solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling.

Change in \(\Delta\)14C over time between 2001 and 2019

Fig. 10. Mean profile \(\Delta\)14C for 2001 and 2019 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2001 and 2019. Error bars show ±1 standard deviation. Vertical lines show \(\Delta\)14C of the atmosphere in 2001 (solid) and 2019 (dashed).

Incubation \(\Delta\)14C-CO2 for 2019 bulk soils

Fig. 10. Rep 1 \(\Delta\)14C-CO2 of 2019 bulk soil incubations

Caption: \(\Delta\)14CO2 by depth for each site in 2019. (Still waiting for data from laboratory duplicates). Note that the 10-20 cm increment sample from the cold granite site appears to have been contaminated: \(\Delta\)14C-CO2 = -396.7.

Incubation vs. bulk soil \(\Delta\)14C

Fig. 10. \(\Delta\)14C of 2019 bulk soil incubations and corresponding bulk soil

Caption: \(\Delta\)14C of bulk soil and respired CO2 by depth for each site in 2019. Error bars show one standard deviation for bulk soil, points show mean of three replicate profiles for bulk soils and single observations for respired CO2 (still waiting for data from laboratory duplicates).

Fig. 10. Regression of 2019 bulk soil incubations and corresponding bulk soil \(\Delta\)14C

Caption: Regressions of \(\Delta\)14C of bulk soil and respired CO2 by depth for each site in 2019. Error bars show one standard deviation for bulk soil, points show mean of three replicate profiles for bulk soils and single observations for respired CO2 (still waiting for data from laboratory duplicates).

Time series: \(\Delta\)14C by depth (as measured)

Fig. 10. Time series of \(\Delta\)14C by depth, as measured

Caption: Points show mean of three profile replicates for 2001 and 2019 samples. Error bars show ± 1 standard deviation of the mean (only a single profile was analyzed in 2009).

Spline fitting

Fit splines to 2009 data to predict at 2001 depths

Soils collected in both the 2001 and 2009 sampling campaigns were sampled by horizon, but the depth intervals differed between the two sampling years. In 2009, full profiles were excavated for each site, as opposed to the shorter profiles collected in 2001 from the GR and AN sites. Radiocarbon was measured on all three replicate profiles at each site for the 2001 samples, but only for one of the replicate profiles at each site in 2009, e.g. ANpp rep2, etc.

In order to compare the radiocarbon profiles between 2001, 2009, and 2019 we interpolated both radiocarbon and carbon stock data at 1 cm intervals for each site in the 2009 and 2019 datasets, and then summed the carbon-stock-weighted radiocarbon values for each depth interval sampled in 2001. A monotonic cubic spline fit was used for the carbon stock interpolation (Wendt and Hauser 2013), and a mass-preserving spline was used to fit the radiocarbon data (Bishop, T.F.A., McBratney, A.B., Laslett, G.M., (1999) Modelling soil attribute depth functions with equal-area quadratic smoothing splines. Geoderma, 91(1-2): 27-45).

Fig. 10. Time series of \(\Delta\)14C by depth (2001, 2009, 2019)

Caption: Points for 2001 samples show the mean \(\Delta\)14C values at the measured depths. Points for 2009 and 2019 samples are spline-fitted estimates of \(\Delta\)14C predicted for the same depth intervals as measured in 2001. Error bars show ± 1 standard deviation of the mean of three replicate profiles for 2001 and 2019 samples (only a single profile was analyzed in 2009).

Fig. 10. Time series of \(\Delta\)14C by depth (splined to 2019 depths)

Caption: Points for 2019 samples show the mean \(\Delta\)14C values at the measured depths. Points for 2001 and 2009 samples are spline-fitted estimates of \(\Delta\)14C predicted for the same depth intervals as measured in 2019. Error bars show ± 1 standard deviation of the mean of three replicate profiles for 2001 and 2019 samples (only a single profile was analyzed in 2009). NB: Only two depth intervals were measured at the cool and cold andesite sites (max depth of 27 and 28 cm, respectively), so linear extrapolation (using the slope of the last 1cm spline-fitted depth increment) was used to extend the profiles to 30 cm.

Initial modeling

The goal of this modeling exercise is to see how parent material and climate/ecosystem affect estimates of soil carbon ages and transit times. Bulk soil 14C observations from 2001, 2009, and 2019 will be used to constrain the carbon models, as well as observations of 14C-CO2 from laboratory soil incubations of soils collected in 2001 and 2019. Previous work has indicated that the carbon stocks at these sites is likely at equilibrium, so we will apply the steady-state assumption to the modeling.

Two-pool parallel model

One pool models have been shown repeatedly to be inadequate for describing soil carbon dynamics. However, as simple models are easier to constrain, we will start with a two-pool parallel model, as this is the simplest model system beyond the single pool approach. The two-pool parallel model requires the following parameters: * decomposition constants for each pool (k1, k2) * input partitioning coefficient (\(\gamma\)) * steady-state carbon stocks (C) * inputs (I) * initial values of 14C

Decomposition rates (k) are related to the amount of 14C in a pre-bomb system (fraction modern, F) at steady-state by the following equations (cf. Schuur, Druffle, and Trumbore, 2016): >Eq. 1

\[F = \frac{k}{k + \lambda}\] >Eq. 2

\[k = \frac{\lambda \cdot F}{1 - F}\] >where \(\lambda\) is the radioactive decay constant (1/8267).

As the decomposition rates will vary, the initial 14C content can be determined dynamically with equation 1.

Carbon stocks are known, while inputs will be estimated and are related to the steady-state conditions by the following equation: >Eq. 3

\[I = (k_{1} \cdot C_{1}) + (k_{2} \cdot C_{2})\] >where C1 and C2 are the carbon stocks of the two model pools.

Both stocks and inputs can be scaled to the known value of the total carbon pool once the steady-state parameters (k1, k2, \(\gamma\)) have been determined. Pool sizes are a function of the inputs and input partitioning coefficient at steady-state.

A Monte-Carlo Markov chain approach will be used for parameter estimation in combination with an initial optimization algorithm to determine the best set of initial parameters.

Mean parameter estimates (0-10 cm) by parent material (PM)
PM depth kfast_mean kslow_mean gam_mean kfast_sd kslow_sd gam_sd
AN 0-10 0.086 0.0024 0.93 0.0094 0.00153 0.054
AN 10-20 0.092 0.0017 0.89 0.0421 0.00045 0.088
AN 20-30 0.066 0.0016 0.70 0.0194 0.00048 0.097
BS 0-10 0.085 0.0055 0.59 0.035 0.00169 0.41
BS 10-20 0.371 0.0036 0.72 0.544 0.00185 0.28
BS 20-30 0.695 0.0021 0.31 0.526 0.00085 0.52
GR 0-10 0.056 0.0055 0.704 0.013 0.0049 0.31
GR 10-20 0.675 0.0040 0.073 0.554 0.0051 0.13
GR 20-30 0.417 0.0026 0.469 0.506 0.0021 0.50
Mean parameter estimates (0-10 cm) by ecosystem (eco)
eco depth kfast_mean kslow_mean gam_mean kfast_sd kslow_sd gam_sd
pp 0-10 0.066 0.0063 0.81 0.026 0.0047 0.16
pp 10-20 0.068 0.0055 0.64 0.032 0.0042 0.38
pp 20-30 0.388 0.0033 0.37 0.527 0.0015 0.34
rf 0-10 0.07 0.0049 0.47 0.025 0.00077 0.40
rf 10-20 0.39 0.0021 0.45 0.528 0.00193 0.46
rf 20-30 0.38 0.0019 0.51 0.538 0.00021 0.46
wf 0-10 0.09 0.0021 0.94 0.025 0.00147 0.049
wf 10-20 0.68 0.0016 0.60 0.548 0.00031 0.528
wf 20-30 0.41 0.0011 0.60 0.512 0.00032 0.529

[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

[[8]]

[[9]]

[[10]]

[[11]]

[[12]]

[[13]]

[[14]]

[[15]]

[[16]]

[[17]]

[[18]]

[[19]]

[[20]]

[[21]]

[[22]]

[[23]]

[[24]]

[[25]]

[[26]]

[[27]]

LS0tCnRpdGxlOiAiU2llcnJhIE5ldmFkYSBUaW1lIFNlcmllcyIKYXV0aG9yOiAiSi4gQmVlbS1NaWxsZXIiCmRhdGU6ICIyMSBPY3QgMjAyMCIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDoKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAyCiAgICBjc3M6IGN1c3RvbS5jc3MKaGVhZGVyX2luY2x1ZGVzOgogIC0gXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9CiAgLSBcdXNlcGFja2FnZXtmbG9hdH0KLS0tCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gJ2NlbnRlcicsIGRldiA9ICdjYWlyb19wZGYnKQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeShJU1JhRCkKbGlicmFyeShHU0lGKQpsaWJyYXJ5KGFxcCkKbGlicmFyeShTb2lsUikKbGlicmFyeShGTUUpCmBgYAoKIyBEYXRhIHByZXBhcmF0aW9uIHNjcmlwdCBmb3IgU2llcnJhIE5ldmFkYSB0aW1lIHNlcmllcyBhbmFseXNpcwoKYGBge3IgbG9hZCBhbXMtamVuYS1pbmdlc3QgZnh9CiMgMS4gUmVhZCBpbiBpc290b3BlIGRhdGEgZnJvbSB2YXJpb3VzIHNvdXJjZXMKIyBGaXJzdCBsb2FkIGhlbHBlciBmdW5jdGlvbnMgJ3JlYWRfamVuYV9hbXNfcmVzdWx0cy5SJywgJ3JlYWRfamVuYV9pc29fcmVzdWx0cy5SJyAKc291cmNlKCIuL3V0aWxpdGllcy9qZW5hX2Ftc19pbmdlc3QuUiIpCnNvdXJjZSgiLi91dGlsaXRpZXMvamVuYV9pc29faW5nZXN0LlIiKQpzb3VyY2UoIi4vdXRpbGl0aWVzL2plbmFfZWxtX2luZ2VzdC5SIikKYGBgCgpgYGB7ciByZWFkLWNuLWlzby1kYXRhLCBpbmNsdWRlID0gRkFMU0V9CiMgMi4gTmV4dCByZWFkIGluIGRhdGEgZnJvbSB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMgaW4gJ2RhdGEvcmF3JwojIDE0QwojIGlkZW50aWZ5IHN1YmRpcmVjdG9yaWVzIGluICdyYXcnIGRpcmVjdG9yeSB3aXRoICJhbXNfamVuYSIgaW4gbmFtZQphbXNfamVuYV9yZXN1bHRzX2RpcnMgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImFtc19qZW5hX3Jlc3VsdHMiLCBmdWxsLm5hbWVzID0gVFJVRSkKYW1zX3Jlc3VsdHNfbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhhbXNfamVuYV9yZXN1bHRzX2RpcnMpLCBmdW5jdGlvbihpKSB7CiAgcmVhZF9qZW5hX2Ftc19yZXN1bHRzKGFtc19qZW5hX3Jlc3VsdHNfZGlyc1tpXSkKfSkKbmFtZXMoYW1zX3Jlc3VsdHNfbHMpIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJhbXNfamVuYV9yZXN1bHRzIikKCiMgIyAxM0MKIyAjIGlkZW50aWZ5IHN1YmRpcmVjdG9yaWVzIGluICdyYXcnIGRpcmVjdG9yeSB3aXRoICJpc29famVuYSIgaW4gbmFtZQojIGlzb19qZW5hX3Jlc3VsdHNfZGlycyA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiaXNvX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQojIGlzb19yZXN1bHRzX2xzIDwtIGxhcHBseShzZXFfYWxvbmcoaXNvX2plbmFfcmVzdWx0c19kaXJzKSwgZnVuY3Rpb24oaSkgewojICAgcmVhZF9qZW5hX2lzb19yZXN1bHRzKGlzb19qZW5hX3Jlc3VsdHNfZGlyc1tpXSkKIyB9KQojIG5hbWVzKGlzb19yZXN1bHRzX2xzKSA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiaXNvX2plbmFfcmVzdWx0cyIpCgojIFJlYWQgaW4gQyBhbmQgTiBkYXRhCmVsbV9yZXN1bHRzX2RpciA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiZWxtX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQplbG1fcmVzdWx0c19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGVsbV9yZXN1bHRzX2RpciksIGZ1bmN0aW9uKGkpIHsKICByZWFkX2plbmFfZWxtX3Jlc3VsdHMoZWxtX3Jlc3VsdHNfZGlyW2ldKQp9KQpuYW1lcyhlbG1fcmVzdWx0c19scykgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImVsbV9qZW5hX3Jlc3VsdHMiKQpgYGAKCmBgYHtyIGRhdGEtdGVtcGxhdGV9CiMgQ3JlYXRlIHRlbXBsYXRlIGZvciBidWxrIHNvaWwgZGF0YQp0ZW1wbGF0ZTE5LmZ4IDwtIGZ1bmN0aW9uKHBtLCBlY28sIG5kZXB0aCkgewogIGRmIDwtIGRhdGEuZnJhbWUoWWVhciA9IHJlcCgyMDE5LCBuZGVwdGggKiAzKSwKICAgICAgICAgICAgICAgICAgIFBNID0gcmVwKHBtLCBuZGVwdGggKiAzKSwKICAgICAgICAgICAgICAgICAgIEVDTyA9IHJlcChlY28sIG5kZXB0aCAqIDMpLAogICAgICAgICAgICAgICAgICAgcHJvX3JlcCA9IHJlcChzZXEoMSwzKSwgZWFjaCA9IG5kZXB0aCksCiAgICAgICAgICAgICAgICAgICBseXJfdG9wID0gcmVwKHNlcSgwLCAobmRlcHRoLTEpICogMTAsIGJ5ID0gMTApLCAzKSwKICAgICAgICAgICAgICAgICAgIGx5cl9ib3QgPSByZXAoc2VxKDEwLCAobmRlcHRoKSAqIDEwLCBieSA9IDEwKSwgMykpCiAgZGYkcHJvX25hbWUgPC0gcGFzdGUwKGRmJFBNLCBkZiRFQ08sICJfIiwgZGYkcHJvX3JlcCkKICBkZiRseXJfbmFtZSA8LSBwYXN0ZTAoZGYkcHJvX25hbWUsICJfIiwgZGYkbHlyX3RvcCwgIi0iLCBkZiRseXJfYm90KQogIHJldHVybihkZikKfQoKIyBDcmVhdGUgdGVtcGxhdGUgZm9yIGNvbXBvc2l0ZSBzb2lsIGRhdGEgKGluY3ViYXRpb25zLCBkZW5zaXR5IGZyYWN0aW9ucywgZXRjLikKdGVtcGxhdGUxOS5jb21wLmZ4IDwtIGZ1bmN0aW9uKHBtLCBlY28sIG5kZXB0aCkgewogIGRmIDwtIGRhdGEuZnJhbWUoWWVhciA9IHJlcCgyMDE5LCAzKSwKICAgICAgICAgICAgICAgICAgIFBNID0gcmVwKHBtLCAzKSwKICAgICAgICAgICAgICAgICAgIEVDTyA9IHJlcChlY28sIDMpLAogICAgICAgICAgICAgICAgICAgbHlyX3RvcCA9IHJlcChzZXEoMCwgKG5kZXB0aC0xKSAqIDEwLCBieSA9IDEwKSksCiAgICAgICAgICAgICAgICAgICBseXJfYm90ID0gcmVwKHNlcSgxMCwgKG5kZXB0aCkgKiAxMCwgYnkgPSAxMCkpKQogIGRmJHByb19uYW1lIDwtIHBhc3RlMChkZiRQTSwgZGYkRUNPLCAiX2NvbXAiKQogIGRmJGx5cl9uYW1lIDwtIHBhc3RlMChkZiRwcm9fbmFtZSwgIl8iLCBkZiRseXJfdG9wLCAiLSIsIGRmJGx5cl9ib3QpCiAgcmV0dXJuKGRmKQp9CgojIHRlbXBsYXRlcyBmb3IgYnVsayBzb2lsIGRhdGEKIyBHUnJmIApHUnJmIDwtIHRlbXBsYXRlMTkuZngoIkdSIiwgInJmIiwgNykKR1JyZiA8LSBpZihhbnkoR1JyZiRseXJfbmFtZSA9PSAiR1JyZl8xXzYwXzcwIikpIHsKICBHUnJmIDwtIEdScmZbLXdoaWNoKEdScmYkbHlyX25hbWUgPT0gIkdScmZfMV82MF83MCIpLCBdICMgTkI6IEdScmZfMV82MF83MCBkb2Vzbid0IGV4aXN0Cn0gZWxzZSB7CiAgR1JyZiA8LSBHUnJmCn0KIyBHUndmCkdSd2YgPC0gdGVtcGxhdGUxOS5meCgiR1IiLCAid2YiLCA5KQojIEdScHAKR1JwcCA8LSB0ZW1wbGF0ZTE5LmZ4KCJHUiIsICJwcCIsIDgpCgojIEFOcmYgCkFOcmYgPC0gdGVtcGxhdGUxOS5meCgiQU4iLCAicmYiLCA2KQojIEFOd2YKQU53ZiA8LSB0ZW1wbGF0ZTE5LmZ4KCJBTiIsICJ3ZiIsIDYpCiMgQU5wcApBTnBwIDwtIHRlbXBsYXRlMTkuZngoIkFOIiwgInBwIiwgOCkKCiMgQlNyZiAKQlNyZiA8LSB0ZW1wbGF0ZTE5LmZ4KCJCUyIsICJyZiIsIDgpCkJTcmYgPC0gaWYoYW55KEJTcmYkbHlyX25hbWUgPT0gIkdScmZfMV82MF83MCIpKSB7CiAgQlNyZiA8LSBCU3JmWy13aGljaChCU3JmJGx5cl9uYW1lID09ICJCU3JmXzFfNzBfODAiKSwgXSAjIE5COiBCU3JmXzFfNzBfODAgZG9lc24ndCBleGlzdAp9IGVsc2UgewogIEJTcmYgPC0gQlNyZgp9IAojIEJTd2YKQlN3ZiA8LSB0ZW1wbGF0ZTE5LmZ4KCJCUyIsICJ3ZiIsIDcpCiMgQlNwcApCU3BwIDwtIHRlbXBsYXRlMTkuZngoIkJTIiwgInBwIiwgOCkKQlNwcFtCU3BwJGx5cl9ib3QgPT0gODAsICJseXJfYm90Il0gPC0gNzUgIyBvbmx5IHNhbXBsZWQgdG8gNzVjbSwgbm90IDgwCgpzcmEuMjAxOS5kZiA8LSByYmluZChHUnJmLCBHUndmLCBHUnBwLAogICAgICAgICAgICAgICAgICAgICBBTnJmLCBBTndmLCBBTnBwLAogICAgICAgICAgICAgICAgICAgICBCU3JmLCBCU3dmLCBCU3BwKQoKIyB0ZW1wbGF0ZSBmb3IgMjAxOSBpbmN1YmF0aW9uIGRhdGEKR1JyZl9pbmMgPC0gdGVtcGxhdGUxOS5jb21wLmZ4KCJHUiIsICJyZiIsIDMpCkdSd2ZfaW5jIDwtIHRlbXBsYXRlMTkuY29tcC5meCgiR1IiLCAid2YiLCAzKQpHUnBwX2luYyA8LSB0ZW1wbGF0ZTE5LmNvbXAuZngoIkdSIiwgInBwIiwgMykKCkFOcmZfaW5jIDwtIHRlbXBsYXRlMTkuY29tcC5meCgiQU4iLCAicmYiLCAzKQpBTndmX2luYyA8LSB0ZW1wbGF0ZTE5LmNvbXAuZngoIkFOIiwgIndmIiwgMykKQU5wcF9pbmMgPC0gdGVtcGxhdGUxOS5jb21wLmZ4KCJBTiIsICJwcCIsIDMpCgpCU3JmX2luYyA8LSB0ZW1wbGF0ZTE5LmNvbXAuZngoIkJTIiwgInJmIiwgMykKQlN3Zl9pbmMgPC0gdGVtcGxhdGUxOS5jb21wLmZ4KCJCUyIsICJ3ZiIsIDMpCkJTcHBfaW5jIDwtIHRlbXBsYXRlMTkuY29tcC5meCgiQlMiLCAicHAiLCAzKQoKc3JhLjIwMTkuaW5jLmRmIDwtIHJiaW5kKEdScmZfaW5jLCBHUndmX2luYywgR1JwcF9pbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICBBTnJmX2luYywgQU53Zl9pbmMsIEFOcHBfaW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgQlNyZl9pbmMsIEJTd2ZfaW5jLCBCU3BwX2luYykKCiMgMjAwMSBidWxrIHNvaWwgdGVtcGxhdGUKc3JhLjIwMDEgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aCh1bmlxdWUoc3JhLjIwMTkuZGYkcHJvX25hbWUpKSkKbmFtZXMoc3JhLjIwMDEpIDwtIHVuaXF1ZShzcmEuMjAxOS5kZiRwcm9fbmFtZSkKCiMgMjAwOSBkYXRhIChmcm9tIEMuIFJhc211c3NlbikKcmFzMTgubHlyIDwtIHJlYWQuY3N2KCIvVXNlcnMvamVmZi9SLzE0Q29uc3RyYWludC9yYXNfMjAxOC5jc3YiKQpyYXMxOC5seXIkRUNPIDwtIGZhY3RvcihyYXMxOC5seXIkTUFTVCwgbGFiZWxzID0gYygicmYiLCJ3ZiIsInBwIikpCgojIDIwMTkgYnVsayBzb2lsIHRlbXBsYXRlCnNyYS4yMDE5IDwtIHNyYS4yMDAxCgojIDIwMTkgaW5jIHRlbXBsYXRlCnNyYS4yMDE5LmluYyA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKHVuaXF1ZShzcmEuMjAxOS5pbmMuZGYkcHJvX25hbWUpKSkKbmFtZXMoc3JhLjIwMTkuaW5jKSA8LSB1bmlxdWUoc3JhLjIwMTkuaW5jLmRmJHByb19uYW1lKQojIGNvcGllcyBmb3IgcmVwcyBvZiBpbmN1YmF0aW9ucwpzcmEuMjAxOS5pbmNfMSA8LSBzcmEuMjAxOS5pbmMKc3JhLjIwMTkuaW5jXzIgPC0gc3JhLjIwMTkuaW5jCmBgYAoKKk1lcmdlIHRlbXBsYXRlcyB3aXRoIDE0QywgQywgYW5kIE4gZGF0YSoKClJhZGlvY2FyYm9uIGFuYWx5c2VzIGZvciB0aGUgMjAwMSBzYW1wbGVzIHdlcmUgbm90IHJ1biBvcmlnaW5hbGx5LCBidXQgd2VyZSBjb21wbGV0ZWQgb24gYXJjaGl2ZWQgc2FtcGxlcyBpbiAyMDIwLgoKYGBge3IgbWVyZ2UtaXNvLWRhdGEtUzAxLXNvaWx9CiMgRXh0cmFjdCAxNEMgZGF0YSBmb3IgMjAwMSBzYW1wbGVzCmFtc19yZXN1bHRzX2xzX1MwMSA8LSBhbXNfcmVzdWx0c19sc1tncmVwKCJTMDEiLCBuYW1lcyhhbXNfcmVzdWx0c19scykpXQpmb3IoaSBpbiBzZXFfYWxvbmcoc3JhLjIwMDEpKSB7CiAgc3JhLjIwMDFbW2ldXSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNfUzAxLCBmdW5jdGlvbihscykgewogICAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgICBpZihhbnkoZ3JlcGwobmFtZXMoc3JhLjIwMDEpW2ldLCBkZiRQcm9iZSkpKSB7CiAgICAgICBkZltncmVwKG5hbWVzKHNyYS4yMDAxKVtpXSwgZGYkUHJvYmUpLCBdIAogICAgICB9CiAgICB9KQogIH0pCiAgc3JhLjIwMDFbW2ldXSA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCB1bmxpc3Qoc3JhLjIwMDFbW2ldXSwgcmVjdXJzaXZlID0gRkFMU0UpKQp9CnNyYS4yMDAxIDwtIGJpbmRfcm93cyh1bmxpc3Qoc3JhLjIwMDEsIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKCiMgY3JlYXRlIElEIGZpZWxkLCB0cmltIGRmLCBhbmQgYWRkIGRlcHRocwpzcmEuMjAwMSRJRCA8LSB1bmxpc3Qoc3Ryc3BsaXQoc3JhLjIwMDEkUHJvYmUsICJfU2llcnJhIE5ldmFkYV8yMDAxIikpCnNyYS4yMDAxIDwtIHNyYS4yMDAxWyAsIGMoIklEIiwgIkYxNEMiLCAiZXJyIiwgIuKIhjE0Qy4o4oCwKSIsICJlcnIuKOKAsCkiKV0KbmFtZXMoc3JhLjIwMDEpIDwtIGMoIklEIiwgImZtIiwgImZtX2VyciIsICJkMTRjIiwgImQxNGNfZXJyIikKc3JhLjIwMDEkbHlyX3RvcCA8LSBhcy5udW1lcmljKGlmZWxzZShzdWJzdHIoc3JhLjIwMDEkSUQsIDksIDkpID09ICItIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIoc3JhLjIwMDEkSUQsIDgsIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0cihzcmEuMjAwMSRJRCwgOCwgOSkpKQpzcmEuMjAwMSRseXJfYm90IDwtIGFzLm51bWVyaWMoaWZlbHNlKHN1YnN0cihzcmEuMjAwMSRJRCwgOSwgOSkgPT0gIi0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIoc3JhLjIwMDEkSUQsIDEwLCBuY2hhcihzcmEuMjAwMSRJRCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0cihzcmEuMjAwMSRJRCwgMTEsIG5jaGFyKHNyYS4yMDAxJElEKSkpKQpzcmEuMjAwMSRwcm9fcmVwIDwtIHN1YnN0cihzcmEuMjAwMSRJRCwgNiwgNikKc3JhLjIwMDEkUE0gPC0gZmFjdG9yKHN1YnN0cihzcmEuMjAwMSRJRCwgMSwgMikpCnNyYS4yMDAxJEVDTyA8LSBmYWN0b3Ioc3Vic3RyKHNyYS4yMDAxJElELCAzLCA0KSwgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkKc3JhLjIwMDEkcHJvX25hbWUgPC0gc3Vic3RyKHNyYS4yMDAxJElELCAxLCA2KQpzcmEuMjAwMSRQTWVjbyA8LSBzdWJzdHIoc3JhLjIwMDEkSUQsIDEsIDQpCgojIHJlbW92ZSBvdXRsaWVyIEFOcHAgc2FtcGxlCnNyYS4yMDAxIDwtIHNyYS4yMDAxWy13aGljaChzcmEuMjAwMSRJRCA9PSAiQU5wcF8zXzYtMTMiKSwgXQoKIyBtYWtlIGxpc3QgYnkgUE1lY28Kc3JhLjIwMDEubHMgPC0gc3BsaXQoc3JhLjIwMDEsIHNyYS4yMDAxJFBNZWNvKQpgYGAKCmBgYHtyIG1lcmdlLWlzby1kYXRhLXNvaWwtUzE5fQojIEV4dHJhY3QgMTRDIGRhdGEgZm9yIDIwMTkgc2FtcGxlcwphbXNfcmVzdWx0c19sc19TMTkgPC0gYW1zX3Jlc3VsdHNfbHNbZ3JlcCgic29pbC1TMTkiLCBuYW1lcyhhbXNfcmVzdWx0c19scykpXQpmb3IoaSBpbiBzZXFfYWxvbmcoc3JhLjIwMTkpKSB7CiAgc3JhLjIwMTlbW2ldXSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNfUzE5LCBmdW5jdGlvbihscykgewogICAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgICBpZihhbnkoZ3JlcGwobmFtZXMoc3JhLjIwMTkpW2ldLCBkZiRQcm9iZSkpKSB7CiAgICAgICBkZltncmVwKG5hbWVzKHNyYS4yMDE5KVtpXSwgZGYkUHJvYmUpLCBdIAogICAgICB9CiAgICB9KQogIH0pCiAgc3JhLjIwMTlbW2ldXSA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCB1bmxpc3Qoc3JhLjIwMTlbW2ldXSwgcmVjdXJzaXZlID0gRkFMU0UpKQp9CnNyYS4yMDE5IDwtIGJpbmRfcm93cyh1bmxpc3Qoc3JhLjIwMTksIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKCiMjIG1lcmdlIHcvIDIwMTkgdGVtcGxhdGUKIyByZW5hbWUgY29scyBpbiBBTVMgdGFibGVzCnNyYS4yMDE5IDwtIHNyYS4yMDE5WyAsIGMoIlByb2JlIiwgIkYxNEMiLCAiZXJyIiwgIuKIhjE0Qy4o4oCwKSIsICJlcnIuKOKAsCkiKV0KbmFtZXMoc3JhLjIwMTkpIDwtIGMoIklEIiwgImZtIiwgImZtX2VyciIsICJkMTRjIiwgImQxNGNfZXJyIikKIyBtZXJnZQpzcmEuMjAxOS5scyA8LSBsYXBwbHkoc3BsaXQoc3JhLjIwMTkuZGYsIHNyYS4yMDE5LmRmJGx5cl9uYW1lKSwgZnVuY3Rpb24oZGYpIHsKICBkZiA8LSBtZXJnZShkZiwgc3JhLjIwMTlbZ3JlcChkZiRseXJfbmFtZSwgc3JhLjIwMTkkSUQpLCBdKQogIGRmJElEIDwtIE5VTEwKICBkZiRQTWVjbyA8LSBwYXN0ZTAoZGYkUE0sIGRmJEVDTykKICByZXR1cm4oZGYpCn0pCgojIHJlc2hhcGUgbGlzdCBieSBQTWVjbwpzcmEuMjAxOS5scyA8LSBzcGxpdChiaW5kX3Jvd3Moc3JhLjIwMTkubHMpLCBiaW5kX3Jvd3Moc3JhLjIwMTkubHMpW1siUE1lY28iXV0pCmBgYAoKYGBge3IgbWVyZ2UtaXNvLWRhdGEtY28yLVMxOX0KIyBFeHRyYWN0IDE0QyBkYXRhIGZvciAyMDE5IHNhbXBsZXMKIyByZXAgMSBkYXRhCmFtc19yZXN1bHRzX2xzX2NvMl9TMTlfMSA8LSBhbXNfcmVzdWx0c19sc1tncmVwKCJjbzItUzE5LTEiLCBuYW1lcyhhbXNfcmVzdWx0c19scykpXQpmb3IoaSBpbiBzZXFfYWxvbmcoc3JhLjIwMTkuaW5jKSkgewogIHNyYS4yMDE5LmluY18xW1tpXV0gPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzX2NvMl9TMTlfMSwgZnVuY3Rpb24obHMpIHsKICAgIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgICAgaWYoYW55KGdyZXBsKG5hbWVzKHNyYS4yMDE5LmluYylbaV0sIGRmJFByb2JlKSkpIHsKICAgICAgIGRmW2dyZXAobmFtZXMoc3JhLjIwMTkuaW5jKVtpXSwgZGYkUHJvYmUpLCBdIAogICAgICB9CiAgICB9KQogIH0pCiAgc3JhLjIwMTkuaW5jXzFbW2ldXSA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCB1bmxpc3Qoc3JhLjIwMTkuaW5jXzFbW2ldXSwgcmVjdXJzaXZlID0gRkFMU0UpKQp9CnNyYS4yMDE5LmluY18xIDwtIGJpbmRfcm93cyh1bmxpc3Qoc3JhLjIwMTkuaW5jXzEsIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKCiMjIG1lcmdlIHcvIDIwMTkgdGVtcGxhdGUKIyByZW5hbWUgY29scyBpbiBBTVMgdGFibGVzCnNyYS4yMDE5LmluY18xIDwtIHNyYS4yMDE5LmluY18xWyAsIGMoIlByb2JlIiwgIkYxNEMiLCAiZXJyIiwgIuKIhjE0Qy4o4oCwKSIsICJlcnIuKOKAsCkiKV0KbmFtZXMoc3JhLjIwMTkuaW5jXzEpIDwtIGMoIklEIiwgImZtIiwgImZtX2VyciIsICJkMTRjIiwgImQxNGNfZXJyIikKIyBtZXJnZQpzcmEuMjAxOS5pbmMubHNfMSA8LSBsYXBwbHkoc3BsaXQoc3JhLjIwMTkuaW5jLmRmLCBzcmEuMjAxOS5pbmMuZGYkbHlyX25hbWUpLCBmdW5jdGlvbihkZikgewogIGRmIDwtIG1lcmdlKGRmLCBzcmEuMjAxOS5pbmNfMVtncmVwKGRmJGx5cl9uYW1lLCBzcmEuMjAxOS5pbmNfMSRJRCksIF0pCiAgZGYkSUQgPC0gTlVMTAogIGRmJFBNZWNvIDwtIHBhc3RlMChkZiRQTSwgZGYkRUNPKQogIHJldHVybihkZikKfSkKCiMgcmVzaGFwZSBsaXN0IGJ5IFBNZWNvCnNyYS4yMDE5LmluYy5sc18xIDwtIHNwbGl0KGJpbmRfcm93cyhzcmEuMjAxOS5pbmMubHNfMSksIGJpbmRfcm93cyhzcmEuMjAxOS5pbmMubHNfMSlbWyJQTWVjbyJdXSkKYGBgCgpgYGB7ciBwbG90LTIwMDEtcHJvZmlsZXMsIGluY2x1ZGUgPSBGQUxTRX0KcHJvLnBsb3QgPC0gZnVuY3Rpb24oZGYsIG1heERlcHRoLCBtaW4xNEMsIHJlcCkgewogIGdncGxvdChkZiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gUE0sIHNoYXBlID0gRUNPLCBncm91cCA9IHJlcCkpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICAgIGdlb21fcGF0aCgpICsKICAgIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKG1heERlcHRoLCAwKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMobWluMTRDLCAxODApKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiZWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJwcCIgPSBleHByZXNzaW9uKGl0YWxpYygiUC4gcG9uZGVyb3NhIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJmIiA9IGV4cHJlc3Npb24oaXRhbGljKCJBLiBtYWduaWZpY2EiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2YiID0gZXhwcmVzc2lvbihpdGFsaWMoIkEuIGNvbmNvbG9yIikpKSwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJwcCIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmYiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9IDE3KSkgKwogICAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICAgIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCn0KCiMgbGFwcGx5KHNyYS4yMDAxLmxzLCBmdW5jdGlvbihkZikgcHJvLnBsb3QoZGYsIG1heChkZiRseXJfYm90KSwgbWluKGRmJGQxNGMpLCBkZiRwcm9fcmVwKSkKYGBgCgpgYGB7ciBwbG90LTIwMTktcHJvZmlsZXMsIGluY2x1ZGUgPSBGQUxTRX0KIyBsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSBwcm8ucGxvdChkZiwgbWF4KGRmJGx5cl9ib3QpLCBtaW4oZGYkZDE0YyksIGRmJHByb19yZXApKQpgYGAKCmBgYHtyIHBsb3QtMjAxOS1jbzItcHJvZmlsZXMsIGluY2x1ZGUgPSBGQUxTRX0KIyBsYXBwbHkoc3JhLjIwMTkuaW5jLmxzXzEsIGZ1bmN0aW9uKGRmKSBwcm8ucGxvdChkZiwgbWF4KGRmJGx5cl9ib3QpLCBtaW4oZGYkZDE0YyksIE5BKSkKYGBgCgojIyAyMDAxIG1lYW4gcmFkaW9jYXJib24gcHJvZmlsZXMKYGBge3IgcGxvdC0yMDAxLWF2Zy1wcm9maWxlc30KIyBmbSBhbmQgZDE0YyBjb252ZXJzaW9uIGZ1bmN0aW9ucwpsYW1iZGEgPC0gMS84MjY3ICMgPSAxLyh0cnVlIG1lYW4gbGlmZSBvZiAxNEMpCmNhbGNfZm0gPC0gZnVuY3Rpb24oZDE0Yywgb2JzX2RhdGVfeSkgewogICgoZDE0Yy8xMDAwKSArIDEpL2V4cChsYW1iZGEgKiAoMTk1MCAtIG9ic19kYXRlX3kpKQp9CmNhbGNfMTRjIDwtIGZ1bmN0aW9uKGZtLCBvYnNfZGF0ZV95KSB7CiAgKGZtICogZXhwKGxhbWJkYSAqICgxOTUwIC0gb2JzX2RhdGVfeSkpIC0gMSkgKiAxMDAwCn0KCiMgY2FsYyBhdG0gaW4gMjAwMSwgMjAwOSwgMjAxOQpEYXRtIDwtIHJiaW5kKGdyYXZlbiwgZnV0dXJlMTRDKQphdG0uZDE0LjIwMDEgPC0gRGF0bVtEYXRtJERhdGUgPT0gMjAwMS41LCAiTkhjMTQiXQphdG0uZm0uMjAwMSA8LSBjYWxjX2ZtKGF0bS5kMTQuMjAwMSwgMjAwMSkKYXRtLmQxNC4yMDA5IDwtIERhdG1bRGF0bSREYXRlID09IDIwMDkuNSwgIk5IYzE0Il0KYXRtLmZtLjIwMDkgPC0gY2FsY19mbShhdG0uZDE0LjIwMDksIDIwMDkpCmF0bS5kMTQuMjAxOSA8LSBEYXRtW0RhdG0kRGF0ZSA9PSAyMDE5LjUsICJOSGMxNCJdCmF0bS5mbS4yMDE5IDwtIGNhbGNfZm0oYXRtLmQxNC4yMDE5LCAyMDE5KQoKIyBjb21iaW5lIHJlcHMKc3JhLjIwMDEuc3VtLmxzICA8LSBsYXBwbHkoc3JhLjIwMDEubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYgPC0gZGF0YS5mcmFtZShkZiAlPiUKICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGx5cl9ib3QgPD0gNDApICU+JQogICAgICAgICAgICAgICAgICAgICBtdXRhdGUobHlyX3RvcF9jaCA9IGFzLmNoYXJhY3RlcihseXJfdG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx5cl9ib3RfY2ggPSBhcy5jaGFyYWN0ZXIobHlyX2JvdCkpICU+JQogICAgICAgICAgICAgICAgICAgICBzZWxlY3QoUE0sIEVDTywgUE1lY28sIGZtLCBkMTRjLCBseXJfdG9wX2NoLCBseXJfYm90X2NoKSAlPiUKICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoUE0sIEVDTywgUE1lY28sIGx5cl90b3BfY2gsIGx5cl9ib3RfY2gpICU+JQogICAgICAgICAgICAgICAgICAgICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpKQogIG5hbWVzKGRmKSA8LSBjKCJQTSIsICJFQ08iLCAiUE1lY28iLCAibHlyX3RvcCIsICJseXJfYm90IiwgImZtIiwgImQxNGMiLCAiZm1fc2QiLCAiZDE0Y19zZCIpCiAgZGYkbHlyX3RvcCA8LSBhcy5udW1lcmljKGRmJGx5cl90b3ApCiAgZGYkbHlyX2JvdCA8LSBhcy5udW1lcmljKGRmJGx5cl9ib3QpCiAgcmV0dXJuKGRmKQp9KQpzcmEuMDEuc3VtIDwtIGJpbmRfcm93cyhzcmEuMjAwMS5zdW0ubHMpCnNyYS4wMS5zdW0gPC0gc3JhLjAxLnN1bVtvcmRlcihzcmEuMDEuc3VtJGx5cl9ib3QpLCBdCgpzcmEuMDEuc3VtIDwtIHNyYS4wMS5zdW0gJT4lCiAgbXV0YXRlKGQxNGNfdSA9IGQxNGMgKyBkMTRjX3NkLAogICAgICAgICBkMTRjX2wgPSBkMTRjIC0gZDE0Y19zZCwKICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpCgojIHBsb3QKZmlnLm4gPC0gMQpzcmEuMDEuc3VtICU+JQogIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGdyb3VwID0gUE1lY28pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDAxKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19sLCAKICAgICAgICB4bWF4ID0gZDE0Y191LAogICAgICAgIGNvbG9yID0gcG0pLCAKICAgIGhlaWdodCA9IDEuNSkgKwogIGdlb21fcGF0aCgpICsKICBzY2FsZV95X3JldmVyc2UobGltaXRzID0gYyg0MCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTAwLCAxODApKSArICAgIAogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJlY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTcpKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIE1lYW4gcHJvZmlsZSAkXERlbHRhJF4xNF5DIGZvciAyMDAxIHNhbXBsZXMqKgoKPipDYXB0aW9uOiogTWVhbiAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAwMS4gRXJyb3IgYmFycyBzaG93IMKxMSBzdGFuZGFyZCBkZXZpYXRpb24sIHNvbGlkIHZlcnRpY2FsIGxpbmUgc2hvd3MgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZSBpbiB0aGUgeWVhciBvZiBzYW1wbGluZy4KCiMjIDIwMDkgcmFkaW9jYXJib24gcHJvZmlsZXMKYGBge3IgcGxvdC0yMDA5LXByb2ZpbGVzfQojIGFkZCBQTWVjbyBjb2wKcmFzMTgubHlyJEVDTyA8LSBmYWN0b3IocmFzMTgubHlyJE1BU1QsIGxhYmVscyA9IGMoInJmIiwid2YiLCJwcCIpKQpyYXMxOC5seXIkUE1lY28gPC0gcGFzdGUwKHJhczE4Lmx5ciRQTSwgcmFzMTgubHlyJEVDTykKCnNyYS4wOS5zdW0gPC0gcmFzMTgubHlyICU+JQogIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkKCmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMDkuc3VtICU+JQogIGdncGxvdCguLCBhZXMobHlyXzE0YywgbHlyX2JvdCwgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGdyb3VwID0gUE1lY28pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDA5KSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX3BhdGgobGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX3lfcmV2ZXJzZSgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTAwLCAxODApKSArICAgIAogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJlY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDIpKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIFByb2ZpbGUgJFxEZWx0YSReMTReQyBmb3IgMjAwOSBzYW1wbGVzKioKCj4qQ2FwdGlvbjoqIFByb2ZpbGUgJFxEZWx0YSReMTReQyBieSBkZXB0aCBmb3IgZWFjaCBzaXRlIGluIDIwMDkuIFNvbGlkIHZlcnRpY2FsIGxpbmUgc2hvd3MgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZSBpbiB0aGUgeWVhciBvZiBzYW1wbGluZy4gRXJyb3IgYmFycyBub3Qgc2hvd24gYXMgb25seSBhIHNpbmdsZSByZXBsaWNhdGUgcHJvZmlsZSB3YXMgYW5hbHl6ZWQgcGVyIHNpdGUuCgojIyAyMDE5IG1lYW4gcmFkaW9jYXJib24gcHJvZmlsZXMKYGBge3IgcGxvdC0yMDE5LWF2Zy1wcm9maWxlc30KIyBjb21iaW5lIHJlcHMKc3JhLjIwMTkuc3VtLmxzICA8LSBsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYgPC0gZGF0YS5mcmFtZShkZiAlPiUKICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGx5cl90b3BfY2ggPSBhcy5jaGFyYWN0ZXIobHlyX3RvcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBseXJfYm90X2NoID0gYXMuY2hhcmFjdGVyKGx5cl9ib3QpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KFBNLCBFQ08sIFBNZWNvLCBmbSwgZDE0YywgbHlyX3RvcF9jaCwgbHlyX2JvdF9jaCkgJT4lCiAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KFBNLCBFQ08sIFBNZWNvLCBseXJfdG9wX2NoLCBseXJfYm90X2NoKSAlPiUKICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSkKICBuYW1lcyhkZikgPC0gYygiUE0iLCAiRUNPIiwgIlBNZWNvIiwgImx5cl90b3AiLCAibHlyX2JvdCIsICJmbSIsICJkMTRjIiwgImZtX3NkIiwgImQxNGNfc2QiKQogIGRmJGx5cl90b3AgPC0gYXMubnVtZXJpYyhkZiRseXJfdG9wKQogIGRmJGx5cl9ib3QgPC0gYXMubnVtZXJpYyhkZiRseXJfYm90KQogIHJldHVybihkZikKfSkKc3JhLjE5LnN1bSA8LSBiaW5kX3Jvd3Moc3JhLjIwMTkuc3VtLmxzKQoKc3JhLjE5LnN1bSA8LSBzcmEuMTkuc3VtICU+JQogIG11dGF0ZShkMTRjX3UgPSBkMTRjICsgZDE0Y19zZCwKICAgICAgICAgZDE0Y19sID0gZDE0YyAtIGQxNGNfc2QsCiAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAKCiMgcGxvdApmaWcubiA8LSBmaWcubiArIDEKc3JhLjE5LnN1bSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBncm91cCA9IFBNZWNvKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAyLjcpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19sLCAKICAgICAgICB4bWF4ID0gZDE0Y191LAogICAgICAgIGNvbG9yID0gcG0pLCAKICAgIGhlaWdodCA9IDEuNSkgKwogIGdlb21fcGF0aCgpICsKICBzY2FsZV95X3JldmVyc2UobGltaXRzID0gYyhtYXgoc3JhLjE5LnN1bSRseXJfYm90KSwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYyhtaW4oc3JhLjE5LnN1bSRkMTRjKSwgMTgwKSkgKyAgICAKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiZWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiBNZWFuIHByb2ZpbGUgJFxEZWx0YSReMTReQyBmb3IgMjAxOSBzYW1wbGVzKioKCj4qQ2FwdGlvbjoqIE1lYW4gJFxEZWx0YSReMTReQyBieSBkZXB0aCBmb3IgZWFjaCBzaXRlIGluIDIwMTkuIEVycm9yIGJhcnMgc2hvdyDCsTEgc3RhbmRhcmQgZGV2aWF0aW9uLCBzb2xpZCB2ZXJ0aWNhbCBsaW5lIHNob3dzICRcRGVsdGEkXjE0XkMgb2YgdGhlIGF0bW9zcGhlcmUgaW4gdGhlIHllYXIgb2Ygc2FtcGxpbmcuCgojIyBDaGFuZ2UgaW4gJFxEZWx0YSReMTReQyBvdmVyIHRpbWUgYmV0d2VlbiAyMDAxIGFuZCAyMDE5IAoKYGBge3IgcGxvdC1hbGwtYXZnfQojIGNvbWJpbmUgJzAxIGFuZCAnMTkgZGF0YSBmb3IgcGxvdHRpbmcKc3JhLjAxLnN1bSRZZWFyIDwtIDIwMDEKc3JhLjE5LnN1bSRZZWFyIDwtIDIwMTkKCnNyYS5hbGwgPC0gcmJpbmQoc3JhLjAxLnN1bSwgc3JhLjE5LnN1bSkKc3JhLmFsbCRZZWFyIDwtIGFzLmZhY3RvcihzcmEuYWxsJFllYXIpCgpmaWcubiA8LSBmaWcubiArIDEKc3JhLmFsbCAlPiUKICBtdXRhdGUoUE1lY29feWVhciA9IHBhc3RlMChQTWVjbywgWWVhciksCiAgICAgICAgIGVjb1llYXIgPSBwYXN0ZTAoRUNPLCBZZWFyKSwKICAgICAgICAgZWNvWWVhcjIgPSBpZmVsc2UoZWNvWWVhciA9PSAicHAyMDAxIiwgIndhcm0gKDIwMDEpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVjb1llYXIgPT0gInBwMjAxOSIsICJ3YXJtICgyMDE5KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZWNvWWVhciA9PSAid2YyMDAxIiwgImNvb2wgKDIwMDEpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZWNvWWVhciA9PSAid2YyMDE5IiwgImNvb2wgKDIwMTkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGVjb1llYXIgPT0gInJmMjAwMSIsICJjb2xkICgyMDAxKSIsICJjb2xkICgyMDE5KSIpKSkpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjb1llYXIyLCBncm91cCA9IFBNZWNvX3llYXIpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDAxKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19sLCAKICAgICAgICB4bWF4ID0gZDE0Y191LAogICAgICAgIGNvbG9yID0gcG0pLCAKICAgIGhlaWdodCA9IDEuNSkgKwogIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBZZWFyKSkgKwogIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKDQxLCAwKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0gKHllYXIpIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSAoMjAwMSkiID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sICgyMDAxKSIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQgKDIwMDEpIiA9IDE3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXJtICgyMDE5KSIgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAxOSkiID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQgKDIwMTkpIiA9IDIpKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIE1lYW4gcHJvZmlsZSAkXERlbHRhJF4xNF5DIGZvciAyMDAxIGFuZCAyMDE5IHNhbXBsZXMqKgoKPipDYXB0aW9uOiogTWVhbiAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAwMSBhbmQgMjAxOS4gRXJyb3IgYmFycyBzaG93IMKxMSBzdGFuZGFyZCBkZXZpYXRpb24uIFZlcnRpY2FsIGxpbmVzIHNob3cgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZSBpbiAyMDAxIChzb2xpZCkgYW5kIDIwMTkgKGRhc2hlZCkuCgojIyBJbmN1YmF0aW9uICRcRGVsdGEkXjE0XkMtQ09+Mn4gZm9yIDIwMTkgYnVsayBzb2lscwoKYGBge3IgcGxvdC1pbmMtZDE0Y30Kc3JhLjIwMTkuaW5jLmRmXzEgPC0gYmluZF9yb3dzKHNyYS4yMDE5LmluYy5sc18xKQoKZmlnLm4gPC0gZmlnLm4gKyAxCnNyYS4yMDE5LmluYy5kZl8xICU+JQogIG11dGF0ZShkMTRjID0gcmVwbGFjZShkMTRjLCB3aGljaChkMTRjIDwgLTMwMCksIE5BKSwgIyByZW1vdmUgR1JyZiAxMC0yMCBwb2ludAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpICU+JQogIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgY29sb3IgPSBwbSwgc2hhcGUgPSBFQ08pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgIyBnZW9tX2Vycm9yYmFyaCgKICAjICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICMgICAgICAgeG1heCA9IGQxNGNfdSwKICAjICAgICAgIGNvbG9yID0gcG0pLCAKICAjICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9wYXRoKGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoInBwIiA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmYiID0gMiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoInBwIiA9ICJ3YXJtIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9ICJjb29sIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJmIiA9ICJjb2xkIikpICsKICB4bGFiKGV4cHJlc3Npb24oJ0luY3ViYXRpb24gJypEZWx0YSonJ14xNConQy1DTydbMl0qJyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKEVDTykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gUmVwIDEgJFxEZWx0YSReMTReQy1DT34yfiBvZiAyMDE5IGJ1bGsgc29pbCBpbmN1YmF0aW9ucyoqCgo+KkNhcHRpb246KiAkXERlbHRhJF4xNF5DT34yfiBieSBkZXB0aCBmb3IgZWFjaCBzaXRlIGluIDIwMTkuIChTdGlsbCB3YWl0aW5nIGZvciBkYXRhIGZyb20gbGFib3JhdG9yeSBkdXBsaWNhdGVzKS4gTm90ZSB0aGF0IHRoZSAxMC0yMCBjbSBpbmNyZW1lbnQgc2FtcGxlIGZyb20gdGhlIGNvbGQgZ3Jhbml0ZSBzaXRlIGFwcGVhcnMgdG8gaGF2ZSBiZWVuIGNvbnRhbWluYXRlZDogJFxEZWx0YSReMTReQy1DT34yfiA9IGByIHtzcmEuMjAxOS5pbmMuZGZfMVtzcmEuMjAxOS5pbmMuZGZfMSRQTWVjbyA9PSAiR1JyZiIgJiBzcmEuMjAxOS5pbmMuZGZfMSRseXJfYm90ID09IDIwLCAiZDE0YyJdfWAuCgojIyBJbmN1YmF0aW9uIHZzLiBidWxrIHNvaWwgJFxEZWx0YSReMTReQwoKYGBge3IgcGxvdC1pbmMtYnVsay1kMTRjfQojIGJpbmQgcm93cyBvZiBpbmMgbGlzdApzcmEuMTkuaW5jIDwtIHNyYS4yMDE5LmluYy5kZl8xWyAsICEobmFtZXMoc3JhLjIwMTkuaW5jLmRmXzEpICVpbiUgYygiZm0iLCAiZm1fZXJyIikpXQpzcmEuMTkuaW5jJFR5cGUgPC0gImluYyIKc3JhLjE5LmluYyRkMTRjX2wgPC0gTkEKc3JhLjE5LmluYyRkMTRjX3UgPC0gTkEKCiMgcmJpbmQgYnVsayBkYXRhCnNyYS4xOS5idWxrIDwtIHNyYS4xOS5pbmMKc3JhLjE5LmJ1bGtbICwgYygiZDE0YyIsICJkMTRjX2wiLCAiZDE0Y191IildIDwtIHNyYS4xOS5zdW1bd2hpY2goc3JhLjE5LnN1bSRseXJfYm90IDwgMzEpLCBjKCJkMTRjIiwgImQxNGNfbCIsICJkMTRjX3UiKV0Kc3JhLjE5LmJ1bGskVHlwZSA8LSAiYnVsayIKc3JhLjE5LmluYy5ibGsgPC0gcmJpbmQoc3JhLjE5LmluYywgc3JhLjE5LmJ1bGspCgpmaWcubiA8LSBmaWcubiArIDEKc3JhLjE5LmluYy5ibGsgJT4lCiAgbXV0YXRlKEVDT3R5cGUgPSBwYXN0ZTAoRUNPLCBUeXBlKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpICU+JQogIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgY29sb3IgPSBwbSwgc2hhcGUgPSBFQ090eXBlLCBsaW5ldHlwZSA9IFR5cGUpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwgCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICBoZWlnaHQgPSAxLjUpICsKICBnZW9tX3BhdGgoKSArCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0gKHR5cGUpIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygicHBidWxrIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2ZidWxrIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmZidWxrIiA9IDE3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcGluYyIgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2ZpbmMiID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJmaW5jIiA9IDIpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJwcGJ1bGsiID0gIndhcm0gKGJ1bGspIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmYnVsayIgPSAiY29vbCAoYnVsaykiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmZidWxrIiA9ICJjb2xkIChidWxrKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBwaW5jIiA9Indhcm0gKGluYykiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2ZpbmMiID0gImNvb2wgKGluYykiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmZpbmMiID0gImNvbGQgKGluYykiKSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiAkXERlbHRhJF4xNF5DIG9mIDIwMTkgYnVsayBzb2lsIGluY3ViYXRpb25zIGFuZCBjb3JyZXNwb25kaW5nIGJ1bGsgc29pbCoqCgo+KkNhcHRpb246KiAkXERlbHRhJF4xNF5DIG9mIGJ1bGsgc29pbCBhbmQgcmVzcGlyZWQgQ09+Mn4gYnkgZGVwdGggZm9yIGVhY2ggc2l0ZSBpbiAyMDE5LiBFcnJvciBiYXJzIHNob3cgb25lIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgYnVsayBzb2lsLCBwb2ludHMgc2hvdyBtZWFuIG9mIHRocmVlIHJlcGxpY2F0ZSBwcm9maWxlcyBmb3IgYnVsayBzb2lscyBhbmQgc2luZ2xlIG9ic2VydmF0aW9ucyBmb3IgcmVzcGlyZWQgQ09+Mn4gKHN0aWxsIHdhaXRpbmcgZm9yIGRhdGEgZnJvbSBsYWJvcmF0b3J5IGR1cGxpY2F0ZXMpLiAKCmBgYHtyIHBsb3QtaW5jLWJ1bGstMTRjLTIwMTl9CiMgZmlyc3QgbWVyZ2UgbWVhbiAxNEMgZGF0YSBmcm9tIDIwMTkgc2FtcGxlcyB3aXRoIGNvbXBvc2l0ZSBpbmN1YmF0aW9uIGRhdGEKbm1zLmluYy5ibGsgPC0gYygiUE0iLCAiRUNPIiwgIlBNZWNvIiwgImx5cl90b3AiLCAibHlyX2JvdCIsICJZZWFyIikKc3JhLjE5LmluYy5ibGsyIDwtIG1lcmdlKHNyYS4xOS5zdW1bd2hpY2goc3JhLjE5LnN1bSRseXJfYm90IDwgMzEpLCBjKG5tcy5pbmMuYmxrLCAiZDE0YyIsICJkMTRjX3UiLCAiZDE0Y19sIildLCAKICAgICAgICAgICAgICAgICAgICAgICAgc3JhLjIwMTkuaW5jLmRmXzFbICwgYyhubXMuaW5jLmJsaywgImQxNGMiKV0sCiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gbm1zLmluYy5ibGssIHN1ZmZpeGVzID0gYygiLmJ1bGsiLCAiLmluYyIpKQoKIyByZWdyZXNzIGJ1bGsgdnMuIGluYwptaW4uaW5jLmJsayA8LSBtaW4oc3JhLjE5LmluYy5ibGsyJGQxNGNfbCkgIyBleGNsdWRlIGhpZ2hseSBuZWdhdGl2ZSBpbmN1YmF0aW9uIHNhbXBsZSBmcm9tIEdSd2YKbWF4LmluYy5ibGsgPC0gbWF4KHNyYS4xOS5pbmMuYmxrMiRkMTRjX3UsIHNyYS4xOS5pbmMuYmxrJGQxNGMuaW5jKQoKIyBXaGF0IGlzIHRoZSBpZGVhbCBncm91cGluZy9leHBlY3RlZCByZWxhdGlvbnNoaXA/CmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMTkuaW5jLmJsazIgJT4lCiAgbXV0YXRlKGRlcHRoID0gaWZlbHNlKGx5cl90b3AgPT0gMCwgIjAtMTBjbSIsIGlmZWxzZShseXJfdG9wID09IDEwLCAiMTAtMjBjbSIsICIyMC0zMGNtIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMuYnVsaywgZDE0Yy5pbmMsIGNvbG9yID0gUE0sIHNoYXBlID0gRUNPLCBncm91cCA9IFBNKSkgKwogICMgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICAjIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19sLCAKICAgICAgICB4bWF4ID0gZDE0Y191LAogICAgICAgIGNvbG9yID0gUE0pLCAKICAgIGhlaWdodCA9IDEuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyI9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygicHAiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2YiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmYiID0gMiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoInBwIiA9ICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2YiID0gImNvb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZiIgPSAiY29sZCIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMobWluLmluYy5ibGssIG1heC5pbmMuYmxrKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKG1pbi5pbmMuYmxrLCBtYXguaW5jLmJsaykpICsKICBjb29yZF9maXhlZCgpICsKICB4bGFiKGV4cHJlc3Npb24oJ0J1bGsgc29pbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ0luY3ViYXRpb24gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhkZXB0aCkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyBhbGwgZGVwdGhzIHRvZ2V0aGVyLCBieSBQTQojIHNyYS4xOS5pbmMuYmxrICU+JQojICAgbXV0YXRlKGRlcHRoID0gaWZlbHNlKGx5cl90b3AgPT0gMCwgIjAtMTBjbSIsIGlmZWxzZShseXJfdG9wID09IDEwLCAiMTAtMjBjbSIsICIyMC0zMGNtIikpKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoZDE0Yy5idWxrLCBkMTRjLmluYywgY29sb3IgPSBkZXB0aCwgc2hhcGUgPSBFQ08pKSArCiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9wb2ludChzaXplID0gMykgKwojICAgZ2VvbV9lcnJvcmJhcmgoCiMgICAgIGFlcyh4bWluID0gZDE0Y19sLCAKIyAgICAgICAgIHhtYXggPSBkMTRjX3UsCiMgICAgICAgICBjb2xvciA9IGRlcHRoKSwgCiMgICAgIGhlaWdodCA9IDEuNSkgKwojICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJwcCIgPSAwLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAxLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZiIgPSAyKSkgKwojICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMobWluLmluYy5ibGssIG1heC5pbmMuYmxrKSkgKwojICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMobWluLmluYy5ibGssIG1heC5pbmMuYmxrKSkgKwojICAgY29vcmRfZml4ZWQoKSArCiMgICB4bGFiKGV4cHJlc3Npb24oJ0J1bGsgc29pbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignSW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoUE0pKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiBSZWdyZXNzaW9uIG9mIDIwMTkgYnVsayBzb2lsIGluY3ViYXRpb25zIGFuZCBjb3JyZXNwb25kaW5nIGJ1bGsgc29pbCAkXERlbHRhJF4xNF5DKioKCj4qQ2FwdGlvbjoqIFJlZ3Jlc3Npb25zIG9mICRcRGVsdGEkXjE0XkMgb2YgYnVsayBzb2lsIGFuZCByZXNwaXJlZCBDT34yfiBieSBkZXB0aCBmb3IgZWFjaCBzaXRlIGluIDIwMTkuIEVycm9yIGJhcnMgc2hvdyBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciBidWxrIHNvaWwsIHBvaW50cyBzaG93IG1lYW4gb2YgdGhyZWUgcmVwbGljYXRlIHByb2ZpbGVzIGZvciBidWxrIHNvaWxzIGFuZCBzaW5nbGUgb2JzZXJ2YXRpb25zIGZvciByZXNwaXJlZCBDT34yfiAoc3RpbGwgd2FpdGluZyBmb3IgZGF0YSBmcm9tIGxhYm9yYXRvcnkgZHVwbGljYXRlcykuCgojIyBUaW1lIHNlcmllczogJFxEZWx0YSReMTReQyBieSBkZXB0aCAoYXMgbWVhc3VyZWQpCmBgYHtyIHBsb3QtdGltZXNlcmllcy1tZWFzLWRlcHRoc30KIyBjb21iaW5lICcwMSwgJzA5LCAnMTkgZGF0YQpzcmEuMDEuMDkuMTkucmF3IDwtIHJiaW5kKGJpbmRfcm93cyhzcmEuMjAwMS5zdW0ubHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRfcm93cyhzcmEuMjAxOS5zdW0ubHMpKQpzcmEuMjAwOS5scyA8LSBzcGxpdChyYXMxOC5seXIsIHJhczE4Lmx5ciRQTWVjbykKc3JhLjIwMDkuZGYgPC0gYmluZF9yb3dzKHNyYS4yMDA5LmxzKQpjb2xuYW1lcyhzcmEuMjAwOS5kZilbd2hpY2goY29sbmFtZXMoc3JhLjIwMDkuZGYpID09ICJseXJfMTRjIildIDwtICJkMTRjIgpzcmEuMjAwOS5kZiA8LSBzcmEuMjAwOS5kZlsgLCB3aGljaChuYW1lcyhzcmEuMjAwOS5kZikgJWluJSBuYW1lcyhzcmEuMDEuMDkuMTkucmF3KSldCnNyYS4yMDA5LmRmIDwtIGNiaW5kKHNyYS4yMDA5LmRmLCAKICAgICAgICAgICAgICAgICAgICAgZm0gPSBOQSwKICAgICAgICAgICAgICAgICAgICAgZDE0Y19zZCA9IE5BLAogICAgICAgICAgICAgICAgICAgICBmbV9zZCA9IE5BKQpzcmEuMDEuMDkuMTkucmF3IDwtIHJiaW5kKHNyYS4wMS4wOS4xOS5yYXcsIHNyYS4yMDA5LmRmKQpzcmEuMDEuMDkuMTkucmF3JFllYXIgPC0gZmFjdG9yKGMocmVwKDIwMDEsIG5yb3coYmluZF9yb3dzKHNyYS4yMDAxLnN1bS5scykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgyMDE5LCBucm93KGJpbmRfcm93cyhzcmEuMjAxOS5zdW0ubHMpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoMjAwOSwgbnJvdyhzcmEuMjAwOS5kZikpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCIyMDAxIiwgIjIwMDkiLCAiMjAxOSIpKQoKIyBwbG90CiMgdy8gcmliYm9ucwojIHNyYS4wMS4wOS4xOS5yYXcgJT4lCiMgICBtdXRhdGUoUE1lY29feWVhciA9IHBhc3RlMChQTWVjbywgWWVhciksCiMgICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAojICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiMgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAojICAgICAgICAgIGQxNGNfdSA9IGQxNGMgKyBkMTRjX3NkLAojICAgICAgICAgIGQxNGNfbCA9IGQxNGMgLSBkMTRjX3NkLAojICAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiMgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkgJT4lCiMgICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGdyb3VwID0gUE1lY29feWVhcikpICsKIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKIyAgIGdlb21fcmliYm9uKGFlcyh4bWluID0gZDE0Y19sLCB4bWF4ID0gZDE0Y191LCBmaWxsID0gcG0sIGFscGhhID0gWWVhciwgZ3JvdXAgPSBQTWVjb195ZWFyKSwKIyAgICAgICAgICAgICAgIGNvbG9yID0gTkEsIHNob3cubGVnZW5kID0gRkFMU0UpICsKIyAgIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBwbSwgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGFscGhhID0gWWVhciksIHNpemUgPSAyKSArCiMgICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGVjbyksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDMpICsKIyAgIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBZZWFyLCBjb2xvciA9IHBtKSwgc2l6ZSA9IDAuNykgKwojICAgc2NhbGVfeV9yZXZlcnNlKCkgKwojICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwojICAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAojICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiMgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMjIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMjEsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMjQpKSArCiMgICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYygiMjAwMSIgPSAuNiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA5IiA9IDAuNCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDE5IiA9IDAuMikpICsKIyAgIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiMgICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgeWxhYigiRGVwdGggKGNtKSIpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgd2l0aCBlcnJvciBiYXJzCiMgc3JhLjAxLjA5LjE5LnJhdyAlPiUKIyAgIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKFBNZWNvLCBZZWFyKSwKIyAgICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiMgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKIyAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiMgICAgICAgICAgZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiMgICAgICAgICAgZDE0Y19sID0gZDE0YyAtIGQxNGNfc2QsCiMgICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKIyAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgZ3JvdXAgPSBQTWVjb195ZWFyKSkgKwojICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IHBtLCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgYWxwaGEgPSBZZWFyKSwgc2l6ZSA9IDMuNSkgKwojICAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIsIGNvbG9yID0gcG0pLCBzaXplID0gMC43KSArCiMgICBnZW9tX2Vycm9yYmFyaCgKIyAgICAgYWVzKHhtaW4gPSBkMTRjX2wsCiMgICAgICAgICB4bWF4ID0gZDE0Y191LAojICAgICAgICAgY29sb3IgPSBwbSwKIyAgICAgICAgIGFscGhhID0gWWVhciksCiMgICAgIGhlaWdodCA9IDEuNSkgKwojICAgc2NhbGVfeV9yZXZlcnNlKCkgKwojICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwojICAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAojICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiMgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTcpKSArCiMgICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYygiMjAwMSIgPSAxLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gMC42LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMTkiID0gMC4zKSkgKwojICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKIyAgIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICB5bGFiKCJEZXB0aCAoY20pIikgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyBqdXN0IHRvcHNvaWwsIHcvIGVycm9yIGJhcnMKZmlnLm4gPC0gZmlnLm4gKyAxCnNyYS4wMS4wOS4xOS5yYXcgPC0gc3JhLjAxLjA5LjE5LnJhd1tvcmRlcihzcmEuMDEuMDkuMTkucmF3JGx5cl90b3ApLCBdCnNyYS4wMS4wOS4xOS5yYXcgJT4lCiAgbXV0YXRlKFBNZWNvX3llYXIgPSBwYXN0ZTAoUE1lY28sIFllYXIpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiAgICAgICAgIGQxNGNfbCA9IGQxNGMgLSBkMTRjX3NkLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGdyb3VwID0gUE1lY29feWVhcikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBwbSwgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGFscGhhID0gWWVhciksIHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIsIGNvbG9yID0gcG0pLCBzaXplID0gMC43KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwKICAgICAgICB4bWF4ID0gZDE0Y191LAogICAgICAgIGNvbG9yID0gcG0sCiAgICAgICAgYWxwaGEgPSBZZWFyKSwKICAgIGhlaWdodCA9IDEuNSkgKwogIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKDQxLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0xNjAsIDE5MCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gMC42LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDE5IiA9IDAuMykpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gVGltZSBzZXJpZXMgb2YgJFxEZWx0YSReMTReQyBieSBkZXB0aCwgYXMgbWVhc3VyZWQqKgoKPipDYXB0aW9uOiogUG9pbnRzIHNob3cgbWVhbiBvZiB0aHJlZSBwcm9maWxlIHJlcGxpY2F0ZXMgZm9yIDIwMDEgYW5kIDIwMTkgc2FtcGxlcy4gRXJyb3IgYmFycyBzaG93IMKxIDEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuIChvbmx5IGEgc2luZ2xlIHByb2ZpbGUgd2FzIGFuYWx5emVkIGluIDIwMDkpLiAKCiMjIFNwbGluZSBmaXR0aW5nCipGaXQgc3BsaW5lcyB0byAyMDA5IGRhdGEgdG8gcHJlZGljdCBhdCAyMDAxIGRlcHRocyoKClNvaWxzIGNvbGxlY3RlZCBpbiBib3RoIHRoZSAyMDAxIGFuZCAyMDA5IHNhbXBsaW5nIGNhbXBhaWducyB3ZXJlIHNhbXBsZWQgYnkgaG9yaXpvbiwgYnV0IHRoZSBkZXB0aCBpbnRlcnZhbHMgZGlmZmVyZWQgYmV0d2VlbiB0aGUgdHdvIHNhbXBsaW5nIHllYXJzLiBJbiAyMDA5LCBmdWxsIHByb2ZpbGVzIHdlcmUgZXhjYXZhdGVkIGZvciBlYWNoIHNpdGUsIGFzIG9wcG9zZWQgdG8gdGhlIHNob3J0ZXIgcHJvZmlsZXMgY29sbGVjdGVkIGluIDIwMDEgZnJvbSB0aGUgR1IgYW5kIEFOIHNpdGVzLiBSYWRpb2NhcmJvbiB3YXMgbWVhc3VyZWQgb24gYWxsIHRocmVlIHJlcGxpY2F0ZSBwcm9maWxlcyBhdCBlYWNoIHNpdGUgZm9yIHRoZSAyMDAxIHNhbXBsZXMsIGJ1dCBvbmx5IGZvciBvbmUgb2YgdGhlIHJlcGxpY2F0ZSBwcm9maWxlcyBhdCBlYWNoIHNpdGUgaW4gMjAwOSwgZS5nLiBBTnBwIHJlcDIsIGV0Yy4KCkluIG9yZGVyIHRvIGNvbXBhcmUgdGhlIHJhZGlvY2FyYm9uIHByb2ZpbGVzIGJldHdlZW4gMjAwMSwgMjAwOSwgYW5kIDIwMTkgd2UgaW50ZXJwb2xhdGVkIGJvdGggcmFkaW9jYXJib24gYW5kIGNhcmJvbiBzdG9jayBkYXRhIGF0IDEgY20gaW50ZXJ2YWxzIGZvciBlYWNoIHNpdGUgaW4gdGhlIDIwMDkgYW5kIDIwMTkgZGF0YXNldHMsIGFuZCB0aGVuIHN1bW1lZCB0aGUgY2FyYm9uLXN0b2NrLXdlaWdodGVkIHJhZGlvY2FyYm9uIHZhbHVlcyBmb3IgZWFjaCBkZXB0aCBpbnRlcnZhbCBzYW1wbGVkIGluIDIwMDEuIEEgbW9ub3RvbmljIGN1YmljIHNwbGluZSBmaXQgd2FzIHVzZWQgZm9yIHRoZSBjYXJib24gc3RvY2sgaW50ZXJwb2xhdGlvbiAoV2VuZHQgYW5kIEhhdXNlciAyMDEzKSwgYW5kIGEgbWFzcy1wcmVzZXJ2aW5nIHNwbGluZSB3YXMgdXNlZCB0byBmaXQgdGhlIHJhZGlvY2FyYm9uIGRhdGEgKEJpc2hvcCwgVC5GLkEuLCBNY0JyYXRuZXksIEEuQi4sIExhc2xldHQsIEcuTS4sICgxOTk5KSBNb2RlbGxpbmcgc29pbCBhdHRyaWJ1dGUgZGVwdGggZnVuY3Rpb25zIHdpdGggZXF1YWwtYXJlYSBxdWFkcmF0aWMgc21vb3RoaW5nIHNwbGluZXMuIEdlb2Rlcm1hLCA5MSgxLTIpOiAyNy00NSkuCgpgYGB7ciBjbi1jbGVhbiwgaW5jbHVkZSA9IEZBTFNFfQplbG1fcmVzdWx0c19kZiA8LSBiaW5kX3Jvd3ModW5saXN0KGVsbV9yZXN1bHRzX2xzLCByZWN1cnNpdmUgPSBGQUxTRSkpCiMgU3BsaXQgSURzClBNZWNvX3JlcF9kZXB0aCA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KHN0cnNwbGl0KGVsbV9yZXN1bHRzX2RmJElELCAiXyIpLCBmdW5jdGlvbih4KSB7IAogICAgZGYgPC0gIGRhdGEuZnJhbWUoUE1lY28gPSB4WzJdLAogICAgICAgICAgICAgICAgICAgICAgcHJvX3JlcCA9IHhbM10sCiAgICAgICAgICAgICAgICAgICAgICBkZXB0aCA9IHhbNF0pCiAgICBkZiRQTSA8LSBzdWJzdHIoZGYkUE1lY28sIDEsIDIpCiAgICBkZiRFQ08gPC0gc3Vic3RyKGRmJFBNZWNvLCAzLCA0KQogICAgcmV0dXJuKGRmKQogIH0pCikKZWxtX3Jlc3VsdHNfZGYgPC0gY2JpbmQoZWxtX3Jlc3VsdHNfZGYsIFBNZWNvX3JlcF9kZXB0aCkKYGBgCgpgYGB7ciBzb2MtMjAwMSwgaW5jbHVkZSA9IEZBTFNFfQojIGFkZCBTT0MgZGF0YSAobHlyX3NvY19rZ20yKSB0byBzcmEuMjAwMS5scwpzb2MuMjAwMSA8LSBkYXRhLmZyYW1lKHJlYWRfZXhjZWwoIi4uL2RhdGEvZXh0ZXJuYWwvc3JhX3Jhc19zdW0vc2llcnJhX2RhdGFfc3VtbWFyeV8yMDIwLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiMjAwMV9idWxrX2RhdGEiKSkKc29jLjIwMDEgPC0gdHlwZS5jb252ZXJ0KHNvYy4yMDAxW2NvbXBsZXRlLmNhc2VzKHNvYy4yMDAxKSwgXSkKc29jLjIwMDEkbHlyX3NvY19rZ20yIDwtIHNvYy4yMDAxJEMuICogc29jLjIwMDEkYmQuZy5jbTMgKiBzb2MuMjAwMSRseXJfYm90IC0gc29jLjIwMDEkbHlyX3RvcCAqIDEwXi0xCm5tcy4yMDAxIDwtIGMoIlBNZWNvIiwgImx5cl90b3AiLCAibHlyX2JvdCIsICJwcm9fcmVwIikKc3JhLjIwMDEubHMgPC0gbGFwcGx5KHNyYS4yMDAxLmxzLCBmdW5jdGlvbihkZikgewogIG1lcmdlKGRmLCBzb2MuMjAwMVsgLCBjKG5tcy4yMDAxLCAibHlyX3NvY19rZ20yIildLCBieSA9IG5tcy4yMDAxKQp9KQoKIyBjYWxjdWxhdGUgY3VtdWxhdGl2ZSBzdG9ja3MKIyBvcmRlciAyMDAxIGRhdGEKc3JhLjIwMDEubHMgPC0gbGFwcGx5KHNyYS4yMDAxLmxzLCBmdW5jdGlvbihkZikgewogIGxzIDwtIHNwbGl0KGRmLCBkZiRwcm9fbmFtZSkKICBscyA8LSBsYXBwbHkobHMsIGZ1bmN0aW9uKHgpIHsKICAgIHggPC0geFtvcmRlcih4JGx5cl9ib3QpLCBdCiAgICB4JGx5cl9zb2NfY210diA8LSBOQQogICAgZm9yKGkgaW4gc2VxX2Fsb25nKHgkbHlyX2JvdCkpIHsKICAgICAgaWYoaSA9PSAxKSB7CiAgICAgICAgeCRseXJfc29jX2NtdHZbaV0gPC0geCRseXJfc29jX2tnbTJbaV0KICAgICAgfSBlbHNlIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2Nfa2dtMltpXSArIHgkbHlyX3NvY19jbXR2W2ktMV0gCiAgICAgIH0KICAgIH0KICAgIHJldHVybih4KQogIH0pCiAgcmV0dXJuKHVuc3BsaXQobHMsIGRmJHByb19uYW1lKSkKfSkKYGBgCgpgYGB7ciBzcGxpbmUtZm0sIGluY2x1ZGUgPSBGQUxTRX0KIyMgc3BsaW5lIGZpdCBmb3IgZm0Kc3JhLjIwMDEuZm0uc3AgPC0gbGFwcGx5KHNyYS4yMDAxLmxzLCBmdW5jdGlvbihkZikgewogIGxhcHBseShzcGxpdChkZiwgZGYkcHJvX25hbWUpLCBmdW5jdGlvbih4KSB7CiAgICBkZXB0aHMoeCkgPC0gcHJvX25hbWUgfiBseXJfdG9wICsgbHlyX2JvdAogICAgeC5tcHMgPC0gbXBzcGxpbmUoeCwgdmFyLm5hbWUgPSAiZm0iKQogICAgeC5tcHMkdmFyLjFjbSA8LSB4Lm1wcyR2YXIuMWNtWzE6bWF4KHgkbHlyX2JvdCldCiAgICByZXR1cm4oeC5tcHMpCiAgfSkKfSkKIyAyMDA5CnNyYS4yMDA5LmZtLnNwIDwtIGxhcHBseShzcmEuMjAwOS5scywgZnVuY3Rpb24oeCkgewogIGRlcHRocyh4KSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgeC5tcHMgPC0gbXBzcGxpbmUoeCwgdmFyLm5hbWUgPSAibHlyX2ZyYWN0aW9uX21vZGVybiIpCiAgeC5tcHMkdmFyLjFjbSA8LSB4Lm1wcyR2YXIuMWNtWzE6bWF4KHgkbHlyX2JvdCldCiAgcmV0dXJuKHgubXBzKQp9KQojIDIwMTkKc3JhLjIwMTkuZm0uc3AgPC0gbGFwcGx5KHNyYS4yMDE5LmxzLCBmdW5jdGlvbihkZikgewogIGxhcHBseShzcGxpdChkZiwgZGYkcHJvX25hbWUpLCBmdW5jdGlvbih4KSB7CiAgICBkZXB0aHMoeCkgPC0gcHJvX25hbWUgfiBseXJfdG9wICsgbHlyX2JvdAogICAgeC5tcHMgPC0gbXBzcGxpbmUoeCwgdmFyLm5hbWUgPSAiZm0iKQogICAgeC5tcHMkdmFyLjFjbSA8LSB4Lm1wcyR2YXIuMWNtWzE6bWF4KHgkbHlyX2JvdCldCiAgICByZXR1cm4oeC5tcHMpCiAgfSkKfSkKYGBgCgpgYGB7ciBzcGxpbmUtYmQtc29jLTE5LCBpbmNsdWRlID0gRkFMU0V9CiMgTmVlZCBTT0Mgc3RvY2sgZGF0YSBmb3IgMjAxOSBzYW1wbGVzOiB1c2UgQkQgZnJvbSAyMDA5IHNhbXBsZXMgCiMgc3BsaW5lIGZpdCBmb3IgYnVsayBkZW5zaXR5CnNyYS4yMDA5LmJkLnNwIDwtIGxhcHBseShzcmEuMjAwOS5scywgZnVuY3Rpb24oeCkgewogIGRlcHRocyh4KSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgeC5tcHMgPC0gbXBzcGxpbmUoeCwgdmFyLm5hbWUgPSAibHlyX2JkX3NhbXAiKQogIHgubXBzJHZhci4xY20gPC0geC5tcHMkdmFyLjFjbVsxOjEwMF0KICByZXR1cm4oeC5tcHMpCn0pCnNyYS4yMDA5LmJkLnNwIDwtIGxhcHBseShzcmEuMjAwOS5iZC5zcCwgZnVuY3Rpb24obHMpIHsKICBkZiA8LSBkYXRhLmZyYW1lKGxzWyJ2YXIuMWNtIl0pCiAgaXggPC0gd2hpY2goaXMubmEoZGYkdmFyLjFjbSkpCiAgZGYkdmFyLjFjbVtpeF0gPC0gZGYkdmFyLjFjbVtpeFsxXS0xXQogIHJldHVybihkZikKfSkKCiMgY2FsY3VsYXRlIG1lYW4gb2YgMWNtIEJEIHByZWRpY3Rpb25zIGZvciBlYWNoIGRlcHRoIGluY3JlbWVudApiZF9wcmVkIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDkuYmQuc3ApLCBmdW5jdGlvbihpKSB7CiAgbHMgPC0gc3BsaXQoc3JhLjIwMTkubHNbW2ldXSwgc3JhLjIwMTkubHNbW2ldXVsicHJvX3JlcCJdKSAjIHNwbGl0IGVhY2ggcmVwbGljYXRlIHByb2ZpbGUKICBscyA8LSBsYXBwbHkoc2VxX2Fsb25nKGxzKSwgZnVuY3Rpb24oZGYpIHsKICAgIGQgPC0gbHNbW2RmXV1bWyJseXJfYm90Il1dICMgZGVwdGggaW50ZXJ2YWxzCiAgICBjIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpICMgdmVjdG9yIGZvciBhdmVyYWdpbmcgMSBjbSBiZCBwcmVkCiAgICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgICAgaWYoaiA9PSAxKSB7CiAgICAgICAgY1tbal1dIDwtIG1lYW4oc3JhLjIwMDkuYmQuc3BbW2ldXVsxOmRbal0sICJ2YXIuMWNtIl0pICMgMS0xMAogICAgICB9IGVsc2UgewogICAgICAgIGNbW2pdXSA8LSBtZWFuKHNyYS4yMDA5LmJkLnNwW1tpXV1bKGRbai0xXSsxKTpkW2pdLCAidmFyLjFjbSJdKSAjIDEwIGNtIGluY3JlbWVudHMKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChjKSkKICAgIH0pCiAgcmV0dXJuKHVuc3BsaXQobHMsIHNyYS4yMDE5LmxzW1tpXV1bInByb19yZXAiXSkpCn0pCgojIG1lcmdlIHByZWRpY3RlZCBiZCB2YWx1ZXMgd2l0aCBzcmEuMjAxOS5scwpubXMgPC0gbmFtZXMoc3JhLjIwMTkubHMpCnNyYS4yMDE5LmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMTkubHMpLCBmdW5jdGlvbihkZikgewogIGNiaW5kKHNyYS4yMDE5LmxzW1tkZl1dLCBiZCA9IGJkX3ByZWRbW2RmXV0pCn0pCm5hbWVzKHNyYS4yMDE5LmxzKSA8LSBubXMKCiMgYWRkIGMgY29uYwpzcmEuMjAxOS5scyA8LSBsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYkZGVwdGggPC0gcGFzdGUwKGRmJGx5cl90b3AsICItIiwgZGYkbHlyX2JvdCkKICBkZiA8LSBtZXJnZShkZiwgZWxtX3Jlc3VsdHNfZGZbICwgYygiUE1lY28iLCAicHJvX3JlcCIsICJkZXB0aCIsICJDIiwgIk4iKV0sIGJ5ID0gYygiUE1lY28iLCAiZGVwdGgiLCAicHJvX3JlcCIpKQogIHJldHVybihkZikKfSkKCiMgY2FsY3VsYXRlIHN0b2NrcwpzcmEuMjAxOS5scyA8LSBsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYkbHlyX3NvYyA8LSBkZiRiZCAqIGRmJEMgIyB1bml0cyB3b3JrIG91dCB0byBrZ19tMiAKICByZXR1cm4oZGYpCn0pCiMgY2FsY3VsYXRlIGNtdHYgc3RvY2tzCnNyYS4yMDE5LmxzIDwtIGxhcHBseShzcmEuMjAxOS5scywgZnVuY3Rpb24oZGYpIHsKICBscyA8LSBzcGxpdChkZiwgZGYkcHJvX25hbWUpCiAgbHMgPC0gbGFwcGx5KGxzLCBmdW5jdGlvbih4KSB7CiAgICB4JGx5cl9zb2NfY210diA8LSBOQQogICAgZm9yKGkgaW4gc2VxX2Fsb25nKHgkbHlyX2JvdCkpIHsKICAgICAgaWYoaSA9PSAxKSB7CiAgICAgICAgeCRseXJfc29jX2NtdHZbaV0gPC0geCRseXJfc29jW2ldCiAgICAgIH0gZWxzZSB7CiAgICAgICAgeCRseXJfc29jX2NtdHZbaV0gPC0geCRseXJfc29jW2ldICsgeCRseXJfc29jX2NtdHZbaS0xXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKHgpCiAgfSkKICByZXR1cm4odW5zcGxpdChscywgZGYkcHJvX25hbWUpKQp9KQpgYGAKCmBgYHtyIHNwbGluZS1zb2MsIGluY2x1ZGUgPSBGQUxTRX0KIyBzcGxpbmUgZml0IGZvciBjYXJib24gc3RvY2tzIChmb3IgY2FsYyB3ZWlnaHRlZCBhdmVyYWdlcykKZGVwdGguc3BsaW5lIDwtIGZ1bmN0aW9uKHgpIHsKICBzcCA8LSBzcGxpbmUoeCwgbWV0aG9kID0gImh5bWFuIikgIyBmaXQgbW9ub3RvbmljIGN1YmljIHNwbGluZQogIHNwLnNzIDwtIHNtb290aC5zcGxpbmUoc3ApICMgY29udmVydCB0byBjbGFzcyAic3BsaW5lIiB3aXRoIHNtb290aC5zcGxpbmUgZnhuCiAgc3RkIDwtIHNlcSgwLCAxMDApICMgaW4gY20gKGxpbmVhciBiZXlvbmQgbGFzdCBtZWFzdXJlZCBkZXB0aCkKICBzcCA8LSBwcmVkaWN0KHNwLnNzLCBzdGQpIAogIGRmIDwtIGRhdGEuZnJhbWUoc3ApCiAgY29sbmFtZXMoZGYpIDwtIGMoImx5cl9ib3QiLCJseXJfc29jIikKICBmb3IoaSBpbiBzZXFfYWxvbmcoZGYkbHlyX2JvdCkpIHsKICAgIGlmKGkgPT0gMSkgewogICAgICBkZiRseXJfc29jW2ldIDwtIGRmJGx5cl9zb2NbaV0KICAgIH0gZWxzZSB7CiAgICAgIGRmJGx5cl9zb2NbaV0gPC0gZGYkbHlyX3NvY1tpICsgMV0gLSBkZiRseXJfc29jW2ldCiAgICB9CiAgfQogIGRmIDwtIGRmWy0xLF0KICByZXR1cm4oZGZbLWxlbmd0aChkZiRseXJfc29jKSwgXSkKfQoKIyBhZGQgKDAsIDApIHBvaW50IGZvciAobHlyX2JvdCwgbHlyX2NtdHZfc3RvY2spCnNyYS4yMDAxLnNwLmxzIDwtIGxhcHBseShzcmEuMjAwMS5scywgZnVuY3Rpb24oZGYpIHsKICBscyA8LSBsYXBwbHkoc3BsaXQoZGYsIGRmJHByb19uYW1lKSwgZnVuY3Rpb24oeCkgewogICAgdDAgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IDEsIG5jb2wgPSBuY29sKHgpKSkKICAgIHh5IDwtIGMod2hpY2gobmFtZXMoeCkgPT0gImx5cl9ib3QiKSwgd2hpY2gobmFtZXMoeCkgPT0gImx5cl9zb2NfY210diIpKQogICAgdDBbICwgeHldIDwtIDAKICAgIG5hbWVzKHQwKSA8LSBuYW1lcyh4KQogICAgdDAkcHJvX25hbWUgPC0gdW5pcXVlKHgkcHJvX25hbWUpCiAgICByZXR1cm4ocmJpbmQodDAsIHgpKQogIH0pCiAgcmV0dXJuKGJpbmRfcm93cyhscykpCn0pCgojIDIwMDkKc3JhLjIwMDkuc3AubHMgPC0gbGFwcGx5KHNyYS4yMDA5LmxzLCBmdW5jdGlvbihkZikgewogIHQwIDwtIGRhdGEuZnJhbWUobWF0cml4KG5yb3cgPSAxLCBuY29sID0gbmNvbChkZikpKQogIHh5IDwtIGMod2hpY2gobmFtZXMoZGYpID09ICJseXJfYm90IiksIHdoaWNoKG5hbWVzKGRmKSA9PSAibHlyX3NvY19jbXR2IikpCiAgdDBbICwgeHldIDwtIDAKICBuYW1lcyh0MCkgPC0gbmFtZXMoZGYpCiAgbmV3IDwtIHJiaW5kKHQwLCBkZikKICByZXR1cm4obmV3KQp9KQoKIyAyMDE5CnNyYS4yMDE5LnNwLmxzIDwtIGxhcHBseShzcmEuMjAxOS5scywgZnVuY3Rpb24oZGYpIHsKICBscyA8LSBsYXBwbHkoc3BsaXQoZGYsIGRmJHByb19uYW1lKSwgZnVuY3Rpb24oeCkgewogICAgdDAgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IDEsIG5jb2wgPSBuY29sKHgpKSkKICAgIHh5IDwtIGMod2hpY2gobmFtZXMoeCkgPT0gImx5cl9ib3QiKSwgd2hpY2gobmFtZXMoeCkgPT0gImx5cl9zb2NfY210diIpKQogICAgdDBbICwgeHldIDwtIDAKICAgIG5hbWVzKHQwKSA8LSBuYW1lcyh4KQogICAgdDAkcHJvX25hbWUgPC0gdW5pcXVlKHgkcHJvX25hbWUpCiAgICByZXR1cm4ocmJpbmQodDAsIHgpKQogIH0pCiAgcmV0dXJuKGJpbmRfcm93cyhscykpCn0pCgojIyBydW4gc3BsaW5lCiMgMjAwMQpzcmEuMjAwMS5vYy5zcCA8LSBsYXBwbHkoc3JhLjIwMDEuc3AubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIGRlcHRoLnNwbGluZSh4WywgYygibHlyX2JvdCIsICJseXJfc29jX2NtdHYiKV0pCiAgfSkKfSkKIyAyMDA5CnNyYS4yMDA5Lm9jLnNwIDwtIGxhcHBseShzcmEuMjAwOS5zcC5scywgZnVuY3Rpb24oeCkgewogIGRlcHRoLnNwbGluZSh4WywgYygibHlyX2JvdCIsICJseXJfc29jX2NtdHYiKV0pCn0pCiMgMjAxOQpzcmEuMjAxOS5vYy5zcCA8LSBsYXBwbHkoc3JhLjIwMTkuc3AubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIGRlcHRoLnNwbGluZSh4WywgYygibHlyX2JvdCIsICJseXJfc29jX2NtdHYiKV0pCiAgfSkKfSkKYGBgCgpgYGB7ciBjd3QtZDE0Yy0wMSwgaW5jbHVkZSA9IEZBTFNFfQojIyBjYWxjdWxhdGUgc3RvY2sgd2VpZ2h0cwojIyAyMDAxIGRlcHRocwojIG9yZGVyICcwMSBkYXRhCnNyYS4yMDAxLnN1bS5scyA8LSBsYXBwbHkoc3JhLjIwMDEuc3VtLmxzLCBmdW5jdGlvbihkZikgZGZbb3JkZXIoZGYkbHlyX2JvdCksIF0pCiMgMjAwOQpjd3QuMDEuMDkgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAwOS5vYy5zcCksIGZ1bmN0aW9uKGkpIHsKICBkIDwtIHNyYS4yMDAxLnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXSAjIG1hcCBvbnRvICcwMSBkZXB0aHMKICBjIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICBpZihqID09IDEpIHsKICAgICAgY1tbal1dIDwtIHNyYS4yMDA5Lm9jLnNwW1tpXV1bMTpkW2pdLCAibHlyX3NvYyJdCiAgICB9IGVsc2UgewogICAgICBjW1tqXV0gPC0gc3JhLjIwMDkub2Muc3BbW2ldXVsoZFtqLTFdKzEpOmRbal0sICJseXJfc29jIl0gCiAgICB9CiAgfQogIHJldHVybih1bmxpc3QobGFwcGx5KGMsIGZ1bmN0aW9uKHgpIHgvc3VtKHgpKSkpICMgcmV0dXJuIHdlaWdodHMKfSkKbmFtZXMoY3d0LjAxLjA5KSA8LSBuYW1lcyhzcmEuMjAwOS5vYy5zcCkKIyAyMDE5IChzZWNvbmQgbGlzdCBsZXZlbCBmcm9tIHByb2ZpbGUgcmVwcykKY3d0LjAxLjE5IDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMTkub2Muc3ApLCBmdW5jdGlvbihpKSB7CiAgbGFwcGx5KHNyYS4yMDE5Lm9jLnNwW1tpXV0sIGZ1bmN0aW9uKGRmKSB7CiAgICBkIDwtIHNyYS4yMDAxLnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXSAjIG1hcCBvbnRvICcwMSBkZXB0aHMKICAgIGMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICAgIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgICBpZihqID09IDEpIHsKICAgICAgICBjW1tqXV0gPC0gZGZbMTpkW2pdLCAibHlyX3NvYyJdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgY1tbal1dIDwtIGRmWyhkW2otMV0rMSk6ZFtqXSwgImx5cl9zb2MiXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChsYXBwbHkoYywgZnVuY3Rpb24oeCkgeC9zdW0oeCkpKSkgICMgcmV0dXJuIHdlaWdodHMKICB9KQp9KQpuYW1lcyhjd3QuMDEuMTkpIDwtIG5hbWVzKHNyYS4yMDE5Lm9jLnNwKQoKCiMjIGNhbGN1bGF0ZSBmbV93dHMKIyMgJzAxIGRlcHRocwojIDIwMTkKZm0ud3QuMDEuMTkgPC0gbGFwcGx5KHNlcV9hbG9uZyhjd3QuMDEuMTkpLCBmdW5jdGlvbihpKSB7CiAgbGFwcGx5KHNlcV9hbG9uZyhjd3QuMDEuMTlbW2ldXSksIGZ1bmN0aW9uKGopIHsKICAgIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjAxLjE5W1tpXV1bW2pdXSkKICAgIGRmJGZtIDwtIHNyYS4yMDE5LmZtLnNwW1tpXV1bW2pdXVtbInZhci4xY20iXV1bMTpsZW5ndGgoY3d0LjAxLjE5W1tpXV1bW2pdXSldCiAgICBkZiRmbV93dCA8LSBkZiRmbSAqIGRmJGN3dAogIHJldHVybihkZikKICB9KQp9KSAKbmFtZXMoZm0ud3QuMDEuMTkpIDwtIG5hbWVzKGN3dC4wMS4xOSkKIyAyMDA5CmZtLnd0LjAxLjA5IDwtIGxhcHBseShzZXFfYWxvbmcoY3d0LjAxLjA5KSwgZnVuY3Rpb24oaSkgewogIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjAxLjA5W1tpXV0pCiAgZGYkZm0gPC0gc3JhLjIwMDkuZm0uc3BbW2ldXVtbInZhci4xY20iXV1bMTpsZW5ndGgoY3d0LjAxLjA5W1tpXV0pXQogIGRmJGZtX3d0IDwtIGRmJGZtICogZGYkY3d0CiAgcmV0dXJuKGRmKQp9KQpuYW1lcyhmbS53dC4wMS4wOSkgPC0gbmFtZXMoY3d0LjAxLjA5KQoKCiMjIGNhbGN1bGF0ZSB3ZWlnaHRlZCBhdmVyYWdlIG9mIGZtIGZvciBlYWNoIGludGVydmFsCiMjICcwMSBkZXB0aHMKIyAyMDA5CnNyYS4wMS4wOS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDAxLnN1bS5scyksIGZ1bmN0aW9uKGkpIHsKICBkIDwtIHNyYS4yMDAxLnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXQogIGYgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgIGlmKGogPT0gMSkgewogICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjAxLjA5W1tpXV1bMTpkW2pdLCAiZm1fd3QiXSkKICAgIH0gZWxzZSB7CiAgICAgIGZbW2pdXSA8LSBzdW0oZm0ud3QuMDEuMDlbW2ldXVsoZFtqLTFdKzEpOmRbal0sICJmbV93dCJdKQogICAgfQogIH0KICByZXR1cm4oY2JpbmQoc3JhLjIwMDEuc3VtLmxzW1tpXV0sIGZtXzA5ID0gdW5saXN0KGYpKSkKfSkKbmFtZXMoc3JhLjAxLjA5LmxzKSA8LSBuYW1lcyhmbS53dC4wMS4wOSkKIyAyMDE5CnNyYS4wMS4xOS5scyA8LSBmbS53dC4wMS4xOSAjIGluaXRpYWxpemUgbGlzdCB3aXRoIGZtIHd0IHN0cnVjdHVyZQpzcmEuMDEuMTkubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAwMS5zdW0ubHMpLCBmdW5jdGlvbihpKSB7CiAgc3JhLjAxLjE5LmxzW1tpXV0gPC0gbGFwcGx5KHNlcV9hbG9uZyhmbS53dC4wMS4xOVtbaV1dKSwgZnVuY3Rpb24oeCkgewogICAgZCA8LSBzcmEuMjAwMS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0KICAgIGYgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICAgIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgICBpZihqID09IDEpIHsKICAgICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjAxLjE5W1tpXV1bW3hdXVsxOmRbal0sICJmbV93dCJdKQogICAgICB9IGVsc2UgewogICAgICAgIGZbW2pdXSA8LSBzdW0oZm0ud3QuMDEuMTlbW2ldXVtbeF1dWyhkW2otMV0rMSk6ZFtqXSwgImZtX3d0Il0pCiAgICAgIH0KICAgIH0KICAgIHJldHVybih1bmxpc3QoZikpIAogIH0pCiAgZm0gPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMDEuMTkubHNbW2ldXVtbMV1dKSwgZnVuY3Rpb24oeikgewogICAgZGF0YS5mcmFtZShmbV8xOV9tZWFuID0gbWVhbihzYXBwbHkoc3JhLjAxLjE5LmxzW1tpXV0sICJbIiwgeiksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgIGZtXzE5X3NkID0gc2Qoc2FwcGx5KHNyYS4wMS4xOS5sc1tbaV1dLCAiWyIsIHopLCBuYS5ybSA9IFRSVUUpKQogICAgfSkKICBmbSA8LSBiaW5kX3Jvd3MoZm0pCiAgcmV0dXJuKGZtKQp9KQpzcmEuMDEuMDkuMTkubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMDEuMDkubHMpLCBmdW5jdGlvbihpKSB7CiAgZGF0YS5mcmFtZShzcmEuMDEuMDkubHNbW2ldXSwgc3JhLjAxLjE5LmxzW1tpXV0pCn0pCm5hbWVzKHNyYS4wMS4wOS4xOS5scykgPC0gbmFtZXMoc3JhLjAxLjA5LmxzKQoKIyMgY3JlYXRlIHRpZHkgY29tYmluZWQgJzAxLCAnMDksICcxOSBkYXRhIGZyYW1lCm5tcyA8LSBjKCJQTSIsICJFQ08iLCAiUE1lY28iLCAibHlyX3RvcCIsICJseXJfYm90IiwgImZtIiwgImZtX3NkIikKc3JhLjAxLjA5LjE5LmRmIDwtIGJpbmRfcm93cyhzcmEuMDEuMDkuMTkubHMpCnNyYS4wMS4wOS4xOSA8LSBzcmEuMDEuMDkuMTkuZGZbLCBubXNdCnNyYS4wMS4wOS4xOSA8LSByYmluZChjYmluZChzcmEuMDEuMDkuMTksIFllYXIgPSBhcy5jaGFyYWN0ZXIoMjAwMSkpLAogICAgICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZShzcmEuMDEuMDkuMTlbLCBubXNbMTo1XV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtID0gc3JhLjAxLjA5LjE5LmRmJGZtXzA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbV9zZCA9IE5BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyID0gYXMuY2hhcmFjdGVyKDIwMDkpKSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZnJhbWUoc3JhLjAxLjA5LjE5Wywgbm1zWzE6NV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IHNyYS4wMS4wOS4xOS5kZiRmbV8xOV9tZWFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbV9zZCA9IHNyYS4wMS4wOS4xOS5kZiRmbV8xOV9zZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVhciA9IGFzLmNoYXJhY3RlcigyMDE5KSkpCgojIGNhbGMgZDE0YyBmcm9tIGZtCnNyYS4wMS4wOS4xOSRkMTRjIDwtIGNhbGNfMTRjKHNyYS4wMS4wOS4xOSRmbSwgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc3JhLjAxLjA5LjE5JFllYXIpKSkKc3JhLjAxLjA5LjE5JGQxNGNfc2QgPC0gYWJzKHNyYS4wMS4wOS4xOSRkMTRjIC0gY2FsY18xNGMoc3JhLjAxLjA5LjE5JGZtICsgc3JhLjAxLjA5LjE5JGZtX3NkLCBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihzcmEuMDEuMDkuMTkkWWVhcikpKSkKYGBgCgpgYGB7ciBjd3QtZDE0Yy0xOSwgaW5jbHVkZSA9IEZBTFNFfQojIyBjYWxjdWxhdGUgc3RvY2sgd2VpZ2h0cwojIyAyMDE5IGRlcHRocwojIDIwMDEKY3d0LjE5LjAxIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDEub2Muc3ApLCBmdW5jdGlvbihpKSB7CiAgbGFwcGx5KHNyYS4yMDAxLm9jLnNwW1tpXV0sIGZ1bmN0aW9uKGRmKSB7CiAgICBkIDwtIHNyYS4yMDE5LnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXQogICAgYyA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogICAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICAgIGlmKGogPT0gMSkgewogICAgICAgIGNbW2pdXSA8LSBkZlsxOmRbal0sICJseXJfc29jIl0KICAgICAgfSBlbHNlIHsKICAgICAgICBjW1tqXV0gPC0gZGZbKGRbai0xXSsxKTpkW2pdLCAibHlyX3NvYyJdIAogICAgICB9CiAgICB9CiAgICByZXR1cm4odW5saXN0KGxhcHBseShjLCBmdW5jdGlvbih4KSB4L3N1bSh4KSkpKQogIH0pCn0pCm5hbWVzKGN3dC4xOS4wMSkgPC0gbmFtZXMoc3JhLjIwMDEub2Muc3ApCiMgMjAwOQpjd3QuMTkuMDkgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAwOS5vYy5zcCksIGZ1bmN0aW9uKGkpIHsKICBkIDwtIHNyYS4yMDE5LnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXQogIGMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgIGlmKGogPT0gMSkgewogICAgICBjW1tqXV0gPC0gc3JhLjIwMDkub2Muc3BbW2ldXVsxOmRbal0sICJseXJfc29jIl0KICAgIH0gZWxzZSB7CiAgICAgIGNbW2pdXSA8LSBzcmEuMjAwOS5vYy5zcFtbaV1dWyhkW2otMV0rMSk6ZFtqXSwgImx5cl9zb2MiXSAKICAgIH0KICB9CiAgcmV0dXJuKHVubGlzdChsYXBwbHkoYywgZnVuY3Rpb24oeCkgeC9zdW0oeCkpKSkKfSkKbmFtZXMoY3d0LjE5LjA5KSA8LSBuYW1lcyhzcmEuMjAwOS5vYy5zcCkKCiMjIGNhbGN1bGF0ZSBmbV93dHMKIyMgJzE5IGRlcHRocwojIDIwMDEKZm0ud3QuMTkuMDEgPC0gbGFwcGx5KHNlcV9hbG9uZyhjd3QuMTkuMDEpLCBmdW5jdGlvbihpKSB7CiAgbGFwcGx5KHNlcV9hbG9uZyhjd3QuMTkuMDFbW2ldXSksIGZ1bmN0aW9uKGopIHsKICAgIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjE5LjAxW1tpXV1bW2pdXSkKICAgIGRmJGZtIDwtIHNyYS4yMDAxLmZtLnNwW1tpXV1bW2pdXVtbInZhci4xY20iXV1bMTpsZW5ndGgoY3d0LjE5LjAxW1tpXV1bW2pdXSldCiAgICAjIGxpbmVhciBleHRyYXBvbGF0aW9uIGZvciBmaWxsaW5nIDIwLTMwY20gZm0gZGF0YQogICAgZm1fMV8zMCA8LSBkZiRmbVsxOjMwXSAjIDAtMzBjbSBmbQogICAgaWYobGVuZ3RoKHdoaWNoKGlzLm5hKGZtXzFfMzApKSkgPiAwKSB7CiAgICAgaXggPC0gd2hpY2goaXMubmEoZm1fMV8zMCkpCiAgICAgaXgubWluIDwtIG1pbihpeCkgIyBmaXJzdCBpcy5uYShmbSkKICAgICBtIDwtIGZtXzFfMzBbaXgubWluLTFdLWZtXzFfMzBbaXgubWluLTJdICMgc2xvcGUgYXQgbGFzdCB0d28gbWVhc3VyZW1lbnQgcG9pbnRzCiAgICAgZm9yKGkgaW4gaXgubWluOjMwKSB7CiAgICAgIGZtXzFfMzBbaV0gPC0gZm1fMV8zMFtpIC0gMV0gKyBtIAogICAgIH0KICAgICBkZiRmbVsxOjMwXSA8LSBmbV8xXzMwIAogICAgfQogICAgZGYkZm1fd3QgPC0gZGYkZm0gKiBkZiRjd3QKICByZXR1cm4oZGYpCiAgfSkKfSkKbmFtZXMoZm0ud3QuMTkuMDEpIDwtIG5hbWVzKGN3dC4xOS4wMSkKIyAyMDA5CmZtLnd0LjE5LjA5IDwtIGxhcHBseShzZXFfYWxvbmcoY3d0LjE5LjA5KSwgZnVuY3Rpb24oaSkgewogIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjE5LjA5W1tpXV0pCiAgZGYkZm0gPC0gc3JhLjIwMDkuZm0uc3BbW2ldXVtbInZhci4xY20iXV1bMTpsZW5ndGgoY3d0LjE5LjA5W1tpXV0pXQogIGRmJGZtX3d0IDwtIGRmJGZtICogZGYkY3d0CiAgcmV0dXJuKGRmKQp9KQpuYW1lcyhmbS53dC4xOS4wOSkgPC0gbmFtZXMoY3d0LjE5LjA5KQoKCiMjIGNhbGN1bGF0ZSB3ZWlnaHRlZCBhdmVyYWdlIG9mIGZtIGZvciBlYWNoIGludGVydmFsCiMjICcxOSBkZXB0aHMKIyAyMDAxCiMgY2FsY3VsYXRlIHdlaWdodGVkIHNwbGluZSB2YWx1ZXMgZm9yIGVhY2ggcHJvZmlsZSByZXAKc3JhLjE5LjAxLnJlcC5scyA8LSBmbS53dC4xOS4wMQpzcmEuMTkuMDEucmVwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMTkuc3VtLmxzKSwgZnVuY3Rpb24oaSkgewogIHNyYS4xOS4wMS5yZXAubHNbW2ldXSA8LSBsYXBwbHkoc2VxX2Fsb25nKGZtLnd0LjE5LjAxW1tpXV0pLCBmdW5jdGlvbih4KSB7CiAgICBkIDwtIHNyYS4yMDE5LnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXQogICAgZiA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogICAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICAgIGlmKGogPT0gMSkgewogICAgICAgIGZbW2pdXSA8LSBzdW0oZm0ud3QuMTkuMDFbW2ldXVtbeF1dWzE6ZFtqXSwgImZtX3d0Il0pCiAgICAgIH0gZWxzZSB7CiAgICAgICAgZltbal1dIDwtIHN1bShmbS53dC4xOS4wMVtbaV1dW1t4XV1bKGRbai0xXSsxKTpkW2pdLCAiZm1fd3QiXSkKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChmKSkgCiAgfSl9KQpzcmEuMTkuMDEucmVwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjE5LjAxLnJlcC5scyksIGZ1bmN0aW9uKGkpIHsKICBuYW1lcyhzcmEuMTkuMDEucmVwLmxzW1tpXV0pIDwtIG5hbWVzKGN3dC4xOS4wMVtbaV1dKQogIHJldHVybihzcmEuMTkuMDEucmVwLmxzW1tpXV0pCn0pCm5hbWVzKHNyYS4xOS4wMS5yZXAubHMpIDwtIG5hbWVzKGZtLnd0LjE5LjAxKQoKIyBhdmVyYWdlIHJlcHMKc3JhLjE5LjAxLmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMTkuc3VtLmxzKSwgZnVuY3Rpb24oaSkgewogIGZtIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjE5LjAxLnJlcC5sc1tbaV1dW1sxXV0pLCBmdW5jdGlvbih6KSB7CiAgICBkYXRhLmZyYW1lKGZtXzAxX21lYW4gPSBtZWFuKHNhcHBseShzcmEuMTkuMDEucmVwLmxzW1tpXV0sICJbIiwgeiksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgIGZtXzAxX3NkID0gc2Qoc2FwcGx5KHNyYS4xOS4wMS5yZXAubHNbW2ldXSwgIlsiLCB6KSwgbmEucm0gPSBUUlVFKSkKICAgIH0pCiAgcmV0dXJuKGJpbmRfcm93cyhmbSkpCn0pCm5hbWVzKHNyYS4xOS4wMS5scykgPC0gbmFtZXMoZm0ud3QuMTkuMDEpCgojIDIwMDkKc3JhLjE5LjA5LmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMTkuc3VtLmxzKSwgZnVuY3Rpb24oaSkgewogIGQgPC0gc3JhLjIwMTkuc3VtLmxzW1tpXV1bWyJseXJfYm90Il1dCiAgZiA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgaWYoaiA9PSAxKSB7CiAgICAgIGZbW2pdXSA8LSBzdW0oZm0ud3QuMTkuMDlbW2ldXVsxOmRbal0sICJmbV93dCJdKQogICAgfSBlbHNlIHsKICAgICAgZltbal1dIDwtIHN1bShmbS53dC4xOS4wOVtbaV1dWyhkW2otMV0rMSk6ZFtqXSwgImZtX3d0Il0pCiAgICB9CiAgfQogIHJldHVybihjYmluZChzcmEuMjAxOS5zdW0ubHNbW2ldXSwgZm1fMDkgPSB1bmxpc3QoZikpKQp9KQpuYW1lcyhzcmEuMTkuMDkubHMpIDwtIG5hbWVzKHNyYS4xOS4wMS5scykKCiMgY29tYmluZQpzcmEuMTkuMDEuMDkubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMTkuMDEubHMpLCBmdW5jdGlvbihpKSB7CiAgZGF0YS5mcmFtZShzcmEuMTkuMDEubHNbW2ldXSwgc3JhLjE5LjA5LmxzW1tpXV0pCn0pCm5hbWVzKHNyYS4xOS4wMS4wOS5scykgPC0gbmFtZXMoc3JhLjE5LjAxLmxzKQoKIyMgY3JlYXRlIHRpZHkgY29tYmluZWQgJzAxLCAnMDksICcxOSBkYXRhIGZyYW1lCnNyYS4xOS4wMS4wOS5kZiA8LSBiaW5kX3Jvd3Moc3JhLjE5LjAxLjA5LmxzKQpzcmEuMTkuMDEuMDkgPC0gc3JhLjE5LjAxLjA5LmRmWywgbm1zXQpzcmEuMTkuMDEuMDkgPC0gcmJpbmQoZGF0YS5mcmFtZShzcmEuMTkuMDEuMDlbLCBubXNbMTo1XV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtID0gc3JhLjE5LjAxLjA5LmRmJGZtXzAxX21lYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtX3NkID0gc3JhLjE5LjAxLjA5LmRmJGZtXzAxX3NkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyID0gYXMuY2hhcmFjdGVyKDIwMDEpKSwKICAgICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZShzcmEuMTkuMDEuMDlbLCBubXNbMTo1XV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBzcmEuMTkuMDEuMDkuZGYkZm1fMDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm1fc2QgPSBOQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyID0gYXMuY2hhcmFjdGVyKDIwMDkpKSwKICAgICAgICAgICAgICAgICAgICAgY2JpbmQoc3JhLjE5LjAxLjA5LCBZZWFyID0gYXMuY2hhcmFjdGVyKDIwMTkpKSkKCiMgY2FsYyBkMTRjIGZyb20gZm0Kc3JhLjE5LjAxLjA5JGQxNGMgPC0gY2FsY18xNGMoc3JhLjE5LjAxLjA5JGZtLCBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihzcmEuMTkuMDEuMDkkWWVhcikpKQpzcmEuMTkuMDEuMDkkZDE0Y19zZCA8LSBhYnMoc3JhLjE5LjAxLjA5JGQxNGMgLSBjYWxjXzE0YyhzcmEuMTkuMDEuMDkkZm0gKyBzcmEuMTkuMDEuMDkkZm1fc2QsIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHNyYS4xOS4wMS4wOSRZZWFyKSkpKQpgYGAKCmBgYHtyIHBsb3QtMDEtMDktMTktMTRjLXByb2ZpbGVzfQpmaWcubiA8LSBmaWcubiArIDEKc3JhLjAxLjA5LjE5ICU+JQogIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKFBNZWNvLCBZZWFyKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIGQxNGNfdSA9IGQxNGMgKyBkMTRjX3NkLAogICAgICAgICBkMTRjX2wgPSBkMTRjIC0gZDE0Y19zZCwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgbGluZXR5cGUgPSBZZWFyLCBncm91cCA9IFBNZWNvX3llYXIpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KGFlcyhhbHBoYSA9IFllYXIpLCBzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBZZWFyKSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIHNjYWxlX3hfY29udGludW91cygpICsgICAgCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNykpICsKICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYygiMjAwMSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA5IiA9IDAuNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxOSIgPSAwLjMpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIFRpbWUgc2VyaWVzIG9mICRcRGVsdGEkXjE0XkMgYnkgZGVwdGggKDIwMDEsIDIwMDksIDIwMTkpKioKCj4qQ2FwdGlvbjoqIFBvaW50cyBmb3IgMjAwMSBzYW1wbGVzIHNob3cgdGhlIG1lYW4gJFxEZWx0YSReMTReQyB2YWx1ZXMgYXQgdGhlIG1lYXN1cmVkIGRlcHRocy4gUG9pbnRzIGZvciAyMDA5IGFuZCAyMDE5IHNhbXBsZXMgYXJlIHNwbGluZS1maXR0ZWQgZXN0aW1hdGVzIG9mICRcRGVsdGEkXjE0XkMgcHJlZGljdGVkIGZvciB0aGUgc2FtZSBkZXB0aCBpbnRlcnZhbHMgYXMgbWVhc3VyZWQgaW4gMjAwMS4gRXJyb3IgYmFycyBzaG93IMKxIDEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuIG9mIHRocmVlIHJlcGxpY2F0ZSBwcm9maWxlcyBmb3IgMjAwMSBhbmQgMjAxOSBzYW1wbGVzIChvbmx5IGEgc2luZ2xlIHByb2ZpbGUgd2FzIGFuYWx5emVkIGluIDIwMDkpLiAKCmBgYHtyIHBsb3QtMTktMDEtMDktMTRjLXByb2ZpbGVzfQpmaWcubiA8LSBmaWcubiArIDEKc3JhLjE5LjAxLjA5ICU+JQogIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKFBNZWNvLCBZZWFyKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIGQxNGNfdSA9IGQxNGMgKyBkMTRjX3NkLAogICAgICAgICBkMTRjX2wgPSBkMTRjIC0gZDE0Y19zZCwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgbGluZXR5cGUgPSBZZWFyLCBncm91cCA9IFBNZWNvX3llYXIpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KGFlcyhhbHBoYSA9IFllYXIpLCBzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBZZWFyKSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoMzAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCkgKyAgICAKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gMC42LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDE5IiA9IDAuMykpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gVGltZSBzZXJpZXMgb2YgJFxEZWx0YSReMTReQyBieSBkZXB0aCAoc3BsaW5lZCB0byAyMDE5IGRlcHRocykqKgoKPipDYXB0aW9uOiogUG9pbnRzIGZvciAyMDE5IHNhbXBsZXMgc2hvdyB0aGUgbWVhbiAkXERlbHRhJF4xNF5DIHZhbHVlcyBhdCB0aGUgbWVhc3VyZWQgZGVwdGhzLiBQb2ludHMgZm9yIDIwMDEgYW5kIDIwMDkgc2FtcGxlcyBhcmUgc3BsaW5lLWZpdHRlZCBlc3RpbWF0ZXMgb2YgJFxEZWx0YSReMTReQyBwcmVkaWN0ZWQgZm9yIHRoZSBzYW1lIGRlcHRoIGludGVydmFscyBhcyBtZWFzdXJlZCBpbiAyMDE5LiBFcnJvciBiYXJzIHNob3cgwrEgMSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4gb2YgdGhyZWUgcmVwbGljYXRlIHByb2ZpbGVzIGZvciAyMDAxIGFuZCAyMDE5IHNhbXBsZXMgKG9ubHkgYSBzaW5nbGUgcHJvZmlsZSB3YXMgYW5hbHl6ZWQgaW4gMjAwOSkuIAo+Kk5COiBPbmx5IHR3byBkZXB0aCBpbnRlcnZhbHMgd2VyZSBtZWFzdXJlZCBhdCB0aGUgY29vbCBhbmQgY29sZCBhbmRlc2l0ZSBzaXRlcyAobWF4IGRlcHRoIG9mIDI3IGFuZCAyOCBjbSwgcmVzcGVjdGl2ZWx5KSwgc28gbGluZWFyIGV4dHJhcG9sYXRpb24gKHVzaW5nIHRoZSBzbG9wZSBvZiB0aGUgbGFzdCAxY20gc3BsaW5lLWZpdHRlZCBkZXB0aCBpbmNyZW1lbnQpIHdhcyB1c2VkIHRvIGV4dGVuZCB0aGUgcHJvZmlsZXMgdG8gMzAgY20uKgoKIyMgSW5pdGlhbCBtb2RlbGluZwoKVGhlIGdvYWwgb2YgdGhpcyBtb2RlbGluZyBleGVyY2lzZSBpcyB0byBzZWUgaG93IHBhcmVudCBtYXRlcmlhbCBhbmQgY2xpbWF0ZS9lY29zeXN0ZW0gYWZmZWN0IGVzdGltYXRlcyBvZiBzb2lsIGNhcmJvbiBhZ2VzIGFuZCB0cmFuc2l0IHRpbWVzLiBCdWxrIHNvaWwgXjE0XkMgb2JzZXJ2YXRpb25zIGZyb20gMjAwMSwgMjAwOSwgYW5kIDIwMTkgd2lsbCBiZSB1c2VkIHRvIGNvbnN0cmFpbiB0aGUgY2FyYm9uIG1vZGVscywgYXMgd2VsbCBhcyBvYnNlcnZhdGlvbnMgb2YgXjE0XkMtQ09+Mn4gZnJvbSBsYWJvcmF0b3J5IHNvaWwgaW5jdWJhdGlvbnMgb2Ygc29pbHMgY29sbGVjdGVkIGluIDIwMDEgYW5kIDIwMTkuIFByZXZpb3VzIHdvcmsgaGFzIGluZGljYXRlZCB0aGF0IHRoZSBjYXJib24gc3RvY2tzIGF0IHRoZXNlIHNpdGVzIGlzIGxpa2VseSBhdCBlcXVpbGlicml1bSwgc28gd2Ugd2lsbCBhcHBseSB0aGUgc3RlYWR5LXN0YXRlIGFzc3VtcHRpb24gdG8gdGhlIG1vZGVsaW5nLgoKIyMjIFR3by1wb29sIHBhcmFsbGVsIG1vZGVsCgpPbmUgcG9vbCBtb2RlbHMgaGF2ZSBiZWVuIHNob3duIHJlcGVhdGVkbHkgdG8gYmUgaW5hZGVxdWF0ZSBmb3IgZGVzY3JpYmluZyBzb2lsIGNhcmJvbiBkeW5hbWljcy4gSG93ZXZlciwgYXMgc2ltcGxlIG1vZGVscyBhcmUgZWFzaWVyIHRvIGNvbnN0cmFpbiwgd2Ugd2lsbCBzdGFydCB3aXRoIGEgdHdvLXBvb2wgcGFyYWxsZWwgbW9kZWwsIGFzIHRoaXMgaXMgdGhlIHNpbXBsZXN0IG1vZGVsIHN5c3RlbSBiZXlvbmQgdGhlIHNpbmdsZSBwb29sIGFwcHJvYWNoLiBUaGUgdHdvLXBvb2wgcGFyYWxsZWwgbW9kZWwgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgoqIGRlY29tcG9zaXRpb24gY29uc3RhbnRzIGZvciBlYWNoIHBvb2wgKCprKn4xfiwgKmsqfjJ+KQoqIGlucHV0IHBhcnRpdGlvbmluZyBjb2VmZmljaWVudCAoJFxnYW1tYSQpCiogc3RlYWR5LXN0YXRlIGNhcmJvbiBzdG9ja3MgKEMpCiogaW5wdXRzIChJKQoqIGluaXRpYWwgdmFsdWVzIG9mIF4xNF5DCgpEZWNvbXBvc2l0aW9uIHJhdGVzICgqayopIGFyZSByZWxhdGVkIHRvIHRoZSBhbW91bnQgb2YgXjE0XkMgaW4gYSBwcmUtYm9tYiBzeXN0ZW0gKGZyYWN0aW9uIG1vZGVybiwgKkYqKSBhdCBzdGVhZHktc3RhdGUgYnkgdGhlIGZvbGxvd2luZyBlcXVhdGlvbnMgKGNmLiBTY2h1dXIsIERydWZmbGUsIGFuZCBUcnVtYm9yZSwgMjAxNik6Cj4qKkVxLiAxKioKCiQkRiA9IFxmcmFje2t9e2sgKyBcbGFtYmRhfSQkCj4qKkVxLiAyKioKCiQkayA9IFxmcmFje1xsYW1iZGEgXGNkb3QgRn17MSAtIEZ9JCQKPndoZXJlICRcbGFtYmRhJCBpcyB0aGUgcmFkaW9hY3RpdmUgZGVjYXkgY29uc3RhbnQgKDEvODI2NykuCgpBcyB0aGUgZGVjb21wb3NpdGlvbiByYXRlcyB3aWxsIHZhcnksIHRoZSBpbml0aWFsIF4xNF5DIGNvbnRlbnQgY2FuIGJlIGRldGVybWluZWQgZHluYW1pY2FsbHkgd2l0aCBlcXVhdGlvbiAxLgoKQ2FyYm9uIHN0b2NrcyBhcmUga25vd24sIHdoaWxlIGlucHV0cyB3aWxsIGJlIGVzdGltYXRlZCBhbmQgYXJlIHJlbGF0ZWQgdG8gdGhlIHN0ZWFkeS1zdGF0ZSBjb25kaXRpb25zIGJ5IHRoZSBmb2xsb3dpbmcgZXF1YXRpb246IAo+KipFcS4gMyoqCgokJEkgPSAoa197MX0gXGNkb3QgQ197MX0pICsgKGtfezJ9IFxjZG90IENfezJ9KSQkCj53aGVyZSAqQ34xfiogYW5kICpDfjJ+KiBhcmUgdGhlIGNhcmJvbiBzdG9ja3Mgb2YgdGhlIHR3byBtb2RlbCBwb29scy4KCkJvdGggc3RvY2tzIGFuZCBpbnB1dHMgY2FuIGJlIHNjYWxlZCB0byB0aGUga25vd24gdmFsdWUgb2YgdGhlIHRvdGFsIGNhcmJvbiBwb29sIG9uY2UgdGhlIHN0ZWFkeS1zdGF0ZSBwYXJhbWV0ZXJzICgqa34xfiosICprfjJ+KiwgJFxnYW1tYSQpIGhhdmUgYmVlbiBkZXRlcm1pbmVkLiBQb29sIHNpemVzIGFyZSBhIGZ1bmN0aW9uIG9mIHRoZSBpbnB1dHMgYW5kIGlucHV0IHBhcnRpdGlvbmluZyBjb2VmZmljaWVudCBhdCBzdGVhZHktc3RhdGUuCgpBIE1vbnRlLUNhcmxvIE1hcmtvdiBjaGFpbiBhcHByb2FjaCB3aWxsIGJlIHVzZWQgZm9yIHBhcmFtZXRlciBlc3RpbWF0aW9uIGluIGNvbWJpbmF0aW9uIHdpdGggYW4gaW5pdGlhbCBvcHRpbWl6YXRpb24gYWxnb3JpdGhtIHRvIGRldGVybWluZSB0aGUgYmVzdCBzZXQgb2YgaW5pdGlhbCBwYXJhbWV0ZXJzLgoKYGBge3IgbW9kLXV0aWxzfQojIG5vdGUgbGFtYmRhIGRlZmluZWQgZWFybGllcgoKIyBrIGZyb20gZnJhY3Rpb24gbW9kZXJuCmsgPC0gZnVuY3Rpb24oRm0pIHsKICAoRm0qbGFtYmRhKS8oMS1GbSkKfQoKIyBkMTRDIGZyb20gZnJhY3Rpb24gbW9kZXJuIApmbV8xNGMgPC0gZnVuY3Rpb24oZm0sIGRhdGUpIHsKICAoZm0qZXhwKGxhbWJkYSooMTk1MCAtIGRhdGUpKSAtIDEpKjEwMDAKfQoKIyBwcmUtYm9tYiBmcmFjdGlvbiBtb2Rlcm4gZnJvbSBrIChzdGVhZHktc3RhdGUgYXNzdW1lZCkKZm0gPC0gZnVuY3Rpb24oayl7CiAgay8oaytsYW1iZGEpCn0KYGBgCgpgYGB7ciBtb2QtZnVucy0ycHB9CiMgc2V0IHZlY3RvciBvZiB0aW1lIGFuZCBhdG0gMTRDIGlucHV0cwpZZWFyIDwtIERhdG0kRGF0ZQoKIyBpbmRleCBvZiB5ZWFycyBmb3Igd2hpY2ggYnVsay9yZXNwIDE0QyBhcmUga25vd24KeWVhci5peCA8LSBjKHdoaWNoKERhdG0kRGF0ZSA9PSAyMDAxLjUpLAogICAgICAgICAgICAgd2hpY2goRGF0bSREYXRlID09IDIwMDkuNSksCiAgICAgICAgICAgICB3aGljaChEYXRtJERhdGUgPT0gMjAxOS41KSkKCiMgZnVuY3Rpb24gZm9yIHNhdmluZyBjb25zdHJhaW50IGRhdGEgaW4gYSBkYXRhZnJhbWUgZm9yIHBsb3R0aW5nIGluIGdncGxvdApjb24uZGYuZnggPC0gZnVuY3Rpb24oUE1lY28sIGx5cl9ib3QpIHsKICBidWxrLmRmIDwtIHNyYS4xOS4wMS4wOVtzcmEuMTkuMDEuMDkkUE1lY28gPT0gUE1lY28gJgogICAgICAgICAgICAgICAgICAgICAgICAgICBzcmEuMTkuMDEuMDkkbHlyX2JvdCA9PSBseXJfYm90LCBjKCJZZWFyIiwgImQxNGMiLCAiZDE0Y19zZCIpXQogIHJlc3AuZGYgPC0gY2JpbmQoc3JhLjIwMTkuaW5jLmRmXzFbc3JhLjIwMTkuaW5jLmRmXzEkUE1lY28gPT0gUE1lY28gJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmEuMjAxOS5pbmMuZGZfMSRseXJfYm90ID09IGx5cl9ib3QsIGMoIlllYXIiLCAiZDE0YyIpXSwgZDE0Y19zZCA9IE5BKQogIGNvbi5kZiA8LSBjYmluZChwb29sID0gYyhyZXAoImJ1bGsgQyIsIG5yb3coYnVsay5kZikpLCByZXAoInJlc3BpcmF0aW9uIiwgbnJvdyhyZXNwLmRmKSkpLCByYmluZChidWxrLmRmLCByZXNwLmRmKSkKICBjb24uZGYkZDE0Y19sIDwtIGNvbi5kZiRkMTRjIC0gY29uLmRmJGQxNGNfc2QKICBjb24uZGYkZDE0Y191IDwtIGNvbi5kZiRkMTRjICsgY29uLmRmJGQxNGNfc2QKICBjb24uZGYkWWVhciA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcihjb24uZGYkWWVhcikpCiAgcmV0dXJuKGNvbi5kZikKfQoKIyBmdW5jdGlvbiBmb3IgdHJpYWwgYW5kIGVycm9yIGFwcHJvYWNoIGZvciBwYXJhbWV0ZXIgZml0dGluZwpwYXIuZnggPC0gZnVuY3Rpb24oSW4sIGdhbSwga3MsIHZlcmJvc2UgPSBUUlVFKSB7CiAgQSA8LSAtMSpkaWFnKGtzKQogIGlmKHZlcmJvc2UpIHsKICAgIGNhdChwYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KSwgIlxuIikKICAgIGNhdChyb3VuZChzdW0oLTEqc29sdmUoQSklKiVjKEluKmdhbSwgSW4qKDEtZ2FtKSkpLCAxKSwgIiAobW9kZWxlZCBzdG9ja3MpXG4iKQogICAgY2F0KGNzb2MuMTkuMF8zMFtbcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCldXVsgLCAibHlyX3NvYyJdLCAiIChtZWFzdXJlZCBzdG9ja3MpXG4iKSAKICB9CiAgCiAgIyBzdGVhZHktc3RhdGUgc3RvY2tzCiAgc3MuY3N0b2NrIDwtICgtMSpzb2x2ZShBKSUqJWMoSW4qZ2FtLCBJbiooMS1nYW0pKSkKICAgIAogICMgRjBfRGVsdGExNEMKICBGMF9EZWx0YTE0QyA8LSBjKERlbHRhMTRDX2Zyb21fQWJzb2x1dGVGcmFjdGlvbk1vZGVybihmbShrc1sxXSkpLCBEZWx0YTE0Q19mcm9tX0Fic29sdXRlRnJhY3Rpb25Nb2Rlcm4oZm0oa3NbMl0pKSkKICAKICAjIDJwb29sIHBhcmFsbGVsIG1vZGVsCiAgaW5pTW9kLjJwcCA8LSBUd29wUGFyYWxsZWxNb2RlbDE0KHQgPSBZZWFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcyA9IGtzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMCA9IGMoc3MuY3N0b2NrWzFdLCBzcy5jc3RvY2tbMl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGMF9EZWx0YTE0QyA9IEYwX0RlbHRhMTRDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IEluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW0gPSBnYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RmMgPSBEYXRtKQogIAogICAgIyBnZXQgQyBhbmQgMTRDIGRhdGEKICAgIGluaS4ycHAuQzE0IDwtIGdldEYxNChpbmlNb2QuMnBwKQogICAgaW5pLjJwcC5DMTRtIDwtIGdldEYxNEMoaW5pTW9kLjJwcCkgCiAgICBpbmkuMnBwLkhSIDwtIGdldEYxNFIoaW5pTW9kLjJwcCkKICAgIGluaS4ycHAuQ3RvdCA8LSBnZXRDKGluaU1vZC4ycHApCiAgICAKICAgICMgZGF0YSBmcmFtZSBmb3IgcGxvdHRpbmcKICAgIHJldHVybihkYXRhLmZyYW1lKAogICAgICB5ZWFycyA9IHJlcChEYXRtJERhdGUsIDUpLAogICAgICBkMTRDID0gYyhpbmkuMnBwLkMxNFssMV0sIAogICAgICAgICAgICAgICBpbmkuMnBwLkMxNFssMl0sIAogICAgICAgICAgICAgICBpbmkuMnBwLkMxNG0sCiAgICAgICAgICAgICAgIGluaS4ycHAuSFIsCiAgICAgICAgICAgICAgIERhdG0kTkhjMTQpLAogICAgICBwb29sID0gcmVwKGMoImZhc3QiLCAic2xvdyIsICJidWxrIEMiLCAicmVzcGlyYXRpb24iLCAiYXRtIiksIGVhY2ggPSBucm93KGluaS4ycHAuQzE0KSkpKQp9CgojIHBsb3QgZnVuY3Rpb24KQzE0LjJwcC5wbG90LmZ4IDwtIGZ1bmN0aW9uKHBsb3QuZGYsIGNvbi5kZikgewogIHBsb3QuZGYgJT4lCiAgZmlsdGVyKHBvb2wgPT0gImJ1bGsgQyIgfCBwb29sID09ICJyZXNwaXJhdGlvbiIgfCBwb29sID09ICJhdG0iKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHllYXJzLCBkMTRDLCBjb2xvciA9IHBvb2wpKSArCiAgZ2VvbV9wYXRoKCkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGNvbi5kZiwgYWVzKFllYXIsIGQxNGMsIGNvbG9yID0gcG9vbCksIHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcihkYXRhID0gY29uLmRmLAogICAgYWVzKHggPSBZZWFyLAogICAgICAgIHltaW4gPSBkMTRjX2wsIAogICAgICAgIHltYXggPSBkMTRjX3UsIAogICAgICAgIGNvbG9yID0gcG9vbCksIAogICAgd2lkdGggPSAuMSwKICAgIGluaGVyaXQuYWVzID0gRkFMU0UpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICBuYW1lID0gIk1vZGVsIHBvb2wiLAogICAgdmFsdWVzID0gYygiYXRtIiA9IDgsCiAgICAgICAgICAgICAgICJidWxrIEMiID0gImJsYWNrIiwKICAgICAgICAgICAgICAgImZhc3QiID0gIiNEODFCNjAiLAogICAgICAgICAgICAgICAic2xvdyIgPSAiIzFFODhFNSIsCiAgICAgICAgICAgICAgICJyZXNwaXJhdGlvbiIgPSAiI0ZGQzEwNyIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMTk1MCwgMjAyMikpICsKICBnZ3RpdGxlKHBhc3RlMChQTWVjbywgIl8iLCBseXJfdG9wLCAiLSIsIGx5cl9ib3QsICIgMnBwIikpICsKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoZXhwcmVzc2lvbignJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKfQoKIyBzZXQgdXAgbW9kZWwgZnVuY3Rpb24gZm9yIE1DTUMgc2ltdWxhdGlvbiBmb3IgMi1wb29sIHBhcmFsbGVsIHN5c3RlbQptb2RGdW5fMnBwIDwtIGZ1bmN0aW9uKHBhcnMsIHBhc3MpewogIEYwX0RlbHRhMTRDIDwtIHVubGlzdChsYXBwbHkocGFyc1sxOjJdLCBmdW5jdGlvbih4KSBEZWx0YTE0Q19mcm9tX0Fic29sdXRlRnJhY3Rpb25Nb2Rlcm4oZm0oeCkpKSkKICBBIDwtIC0xKmRpYWcocGFyc1sxOjJdKQogIHNzLmNzdG9jayA8LSAoLTEqc29sdmUoQSklKiVjKEluKnBhcnNbM10sIEluKigxLXBhcnNbM10pKSkKICBtb2QgPC0gVHdvcFBhcmFsbGVsTW9kZWwxNCgKICAgIHQgPSBZZWFyLAogICAga3MgPSBwYXJzWzE6Ml0sCiAgICBDMCA9IGMoc3MuY3N0b2NrWzFdLCBzcy5jc3RvY2tbMl0pLAogICAgRjBfRGVsdGExNEMgPSBGMF9EZWx0YTE0QywKICAgIEluID0gSW4sCiAgICBnYW0gPSBwYXJzWzNdLAogICAgaW5wdXRGYyA9IERhdG0sCiAgICBwYXNzID0gcGFzcykKICBDMTRtIDwtIGdldEYxNEMobW9kKQogIEMxNHAgPC0gZ2V0RjE0KG1vZCkKICBDMTRyIDwtIGdldEYxNFIobW9kKQogIEN0b3QgPC0gZ2V0Qyhtb2QpCiAgcmV0dXJuKGRhdGEuZnJhbWUodGltZSA9IFllYXIsIAogICAgICAgICAgICAgICAgICAgIGJ1bGtDID0gQzE0bSwgCiAgICAgICAgICAgICAgICAgICAgcmVzcCA9IEMxNHIsCiAgICAgICAgICAgICAgICAgICAgc29jcyA9IHJvd1N1bXMoQ3RvdCkpKQp9CmBgYAoKYGBge3IgbW9kLWNvbnN0cmFpbnRzLCBpbmNsdWRlID0gRkFMU0V9CiMjIElucHV0cwojIElucHV0cyBtYXkgdmFyeSBhbW9uZyBzaXRlcywgYW5kIEkgY291bGQgdXNlIHJlc3BpcmF0aW9uIGRhdGEgZnJvbSBpbmN1YmF0aW9ucyB0byBjb250cm9sIHRoYXQKIyBGb3Igbm93LCB0aGV5IHdpbGwgYmUga2VwdCBjb25zdGFudCBhY3Jvc3Mgc2l0ZXMgYnV0IGJlIGFsbG93ZWQgdG8gdmFyeSBieSBkZXB0aApJbi4xMCA8LSAuMTYgIyB0aGlzIHdhcyBmaXQgdG8gdGhlIEJTd2YgMC0xMCBzaXRlCkluLjIwIDwtIC4xICMgdG90YWxseSBtYWRlIHVwCkluLjMwIDwtIC4wNSAjIHRvdGFsbHkgbWFkZSB1cAoKIyMgU09DIHN0b2NrcwojIHVzZSAyMDE5IFNPQyBzdG9ja3MgZm9yIHN0ZWFkeS1zdGF0ZSBlc3RpbWF0ZXMKY3NvYy4xOS4wXzMwIDwtIGJpbmRfcm93cygKICBsYXBwbHkoc3JhLjIwMTkuc3AubHMsIGZ1bmN0aW9uKGRmKSB7CiAgICBkZiA8LSBzdXBwcmVzc01lc3NhZ2VzKAogICAgICBkZiAlPiUgCiAgICAgICAgZmlsdGVyKGx5cl9ib3QgPCAzMSAmIGx5cl9ib3QgPiAwKSAlPiUKICAgICAgICBzZWxlY3QoUE1lY28sIGx5cl90b3AsIGx5cl9ib3QsIGx5cl9zb2MpICU+JQogICAgICAgIGdyb3VwX2J5KFBNZWNvLCBseXJfdG9wLCBseXJfYm90KSAlPiUKICAgICAgICBzdW1tYXJpemUobHlyX3NvYyA9IG1lYW4obHlyX3NvYykpKQogICAgcmV0dXJuKGRhdGEuZnJhbWUoZGYpKQogIH0pCikKIyBjb252ZXJ0IHRvIDI3IGVsZW1lbnQgbGlzdApjc29jLjE5LjBfMzAgPC0gc3BsaXQoY3NvYy4xOS4wXzMwLCBwYXN0ZTAoY3NvYy4xOS4wXzMwJFBNZWNvLCAiXyIsIGNzb2MuMTkuMF8zMCRseXJfdG9wLCAiLSIsIGNzb2MuMTkuMF8zMCRseXJfYm90KSkKCiMjIDE0QyBjb25zdHJhaW50cwojIGJ1bGsKb2JzLmJ1bGsuMTRjIDwtIHVubGlzdCgKICBsYXBwbHkoc2VxX2Fsb25nKHNyYS4xOS4wMS5yZXAubHMpLCBmdW5jdGlvbihpKSB7CiAgIyBpbmRleCBhbG9uZyBkZXB0aCBpbnRlcnZhbHMgMC0xMCwgMTAtMjAsIDIwLTMwCiAgZGVwdGgubHMgPC0gbGFwcGx5KHNlcV9hbG9uZygxOjMpLCBmdW5jdGlvbihqKSB7CiAgICBjKHVubGlzdChsYXBwbHkoc3JhLjE5LjAxLnJlcC5sc1tbaV1dLCAiW1siLCBqKSksCiAgICAgIHNwbGl0KHNwbGl0KHNyYS4xOS4wMS4wOSwgc3JhLjE5LjAxLjA5JFBNZWNvKVtbaV1dLAogICAgICAgICAgICBzcGxpdChzcmEuMTkuMDEuMDksIHNyYS4xOS4wMS4wOSRQTWVjbylbW2ldXVsibHlyX2JvdCJdKVtbal1dWyAsICJmbSJdWzJdLAogICAgICB1bmxpc3Qoc3BsaXQoc3JhLjIwMTkubHNbW2ldXSwgc3JhLjIwMTkubHNbW2ldXVsibHlyX2JvdCJdKVtbal1dWyJmbSJdKSkKICB9KQogIHJlcHMwMSA8LSBsZW5ndGgoc3JhLjE5LjAxLnJlcC5sc1tbaV1dKQogIGRlcHRoLmRmcyA8LSBsYXBwbHkoZGVwdGgubHMsIGZ1bmN0aW9uKGZtKSB7CiAgICBkYXRhLmZyYW1lKHRpbWUgPSBjKHJlcCgyMDAxLjUsIHJlcHMwMSksIDIwMDkuNSwgcmVwKDIwMTkuNSwgMykpLAogICAgICAgICAgICAgICBidWxrQyA9IERlbHRhMTRDX2Zyb21fQWJzb2x1dGVGcmFjdGlvbk1vZGVybihmbSkpCiAgfSkKICByZXR1cm4oZGVwdGguZGZzKQp9KSwgcmVjdXJzaXZlID0gRkFMU0UpCm5hbWVzKG9icy5idWxrLjE0YykgPC0gcGFzdGUwKHJlcChjKCJBTiIsICJCUyIsICJHUiIpLCBlYWNoID0gOSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcChjKCJwcCIsICJyZiIsICJ3ZiIpLCBlYWNoID0gMywgdGltZXMgPSAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKGMoIl8wLTEwIiwgIl8xMC0yMCIsICJfMjAtMzAiKSwgdGltZXMgPSA5KSkKCiMgcmVzcGlyYXRpb24Kb2JzLnJlc3AuMTRjIDwtIHNwbGl0KHNyYS4yMDE5LmluYy5kZl8xLCBnc3ViKCJjb21wXyIsICIiLCBzcmEuMjAxOS5pbmMuZGZfMSRseXJfbmFtZSkpCm9icy5yZXNwLjE0YyA8LSBsYXBwbHkob2JzLnJlc3AuMTRjLCBmdW5jdGlvbihkZikgewogIGRmJHJlc3AgPC0gZGYkZDE0YwogIGRmJHRpbWUgPC0gZGYkWWVhciArIC41CiAgcmV0dXJuKGRmWyAsIGMoInRpbWUiLCAicmVzcCIpXSkKfSkKCiMjIEluaXRpYWwgcGFyYW1ldGVycwojIGluaXRpYWxpemUgbGlzdCAoOSBzaXRlcyBieSAzIGRlcHRocyA9IDI3IGVsZW1lbnRzKQpwYXJzLmkgPC0gbGFwcGx5KHNlcV9sZW4oMjcpLCBmdW5jdGlvbihkZikgewogIGRmIDwtIGRhdGEuZnJhbWUoa2Zhc3QgPSBOQSwKICAgICAgICAgICAgICAgICAgIGtzbG93ID0gTkEsCiAgICAgICAgICAgICAgICAgICBnYW0gPSBOQSkKfSkKbmFtZXMocGFycy5pKSA8LSBuYW1lcyhvYnMuYnVsay4xNGMpCmBgYAoKYGBge3IgaW5pLW1vZC1wYXJzLUFOcHAtMC0xMCwgaW5jbHVkZSA9IEZBTFNFfQojIFNpdGUvZGVwdGggaW5mbwpQTWVjbyA8LSAiQU5wcCIKbHlyX2JvdCA8LSAxMApseXJfdG9wIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCAwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgMTAsIDIwKSkKCiMgMTRDIGNvbnN0cmFpbnRzCmNvbi5kZiA8LSBjb24uZGYuZngoUE1lY28sIGx5cl9ib3QpCiAgICAgICAgICAgICAgICAKIyBpbml0aWFsIHBhcnMKSW4gPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIEluLjEwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgSW4uMjAsIEluLjMwKSkKZ2FtIDwtIC45NSAjIHBhcnRpdGlvbmluZyBjb2VmCmtzIDwtIGMoLjEsIC4wMDUpICMgZmFzdCwgc2xvdwoKIyBldmFsdWF0ZSBwYXJzCmluaS4ycHAuQzE0LmRmIDwtIHBhci5meChJbiwgZ2FtLCBrcykKCiMgcGxvdApDMTQuMnBwLnBsb3QuZngoaW5pLjJwcC5DMTQuZGYsIGNvbi5kZikKCiMgc2F2ZSBwYXJzCnBhcnMuaVtbcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCldXSA8LSBjKGtzLCBnYW0pIApgYGAKCmBgYHtyIGluaS1tb2QtcGFycy1BTnBwLTEwLTIwLCBpbmNsdWRlID0gRkFMU0V9CiMgU2l0ZS9kZXB0aCBpbmZvClBNZWNvIDwtICJBTnBwIgpseXJfYm90IDwtIDIwCmx5cl90b3AgPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIDAsIGlmZWxzZShseXJfYm90ID09IDIwLCAxMCwgMjApKQoKIyAxNEMgY29uc3RyYWludHMKY29uLmRmIDwtIGNvbi5kZi5meChQTWVjbywgbHlyX2JvdCkKICAgICAgICAgICAgICAgIAojIGluaXRpYWwgcGFycwpJbiA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgSW4uMTAsIGlmZWxzZShseXJfYm90ID09IDIwLCBJbi4yMCwgSW4uMzApKQpnYW0gPC0gLjk1ICMgcGFydGl0aW9uaW5nIGNvZWYKa3MgPC0gYyguMSwgLjAwMTcpICMgZmFzdCwgc2xvdwoKIyBldmFsdWF0ZSBwYXJzCmluaS4ycHAuQzE0LmRmIDwtIHBhci5meChJbiwgZ2FtLCBrcykKCiMgcGxvdApDMTQuMnBwLnBsb3QuZngoaW5pLjJwcC5DMTQuZGYsIGNvbi5kZikKCiMgc2F2ZSBwYXJzCnBhcnMuaVtbcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCldXSA8LSBjKGtzLCBnYW0pIApgYGAKCmBgYHtyIGluaS1tb2QtcGFycy1BTnBwLTIwLTMwLCBpbmNsdWRlID0gRkFMU0V9CiMgU2l0ZS9kZXB0aCBpbmZvClBNZWNvIDwtICJBTnBwIgpseXJfYm90IDwtIDMwCmx5cl90b3AgPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIDAsIGlmZWxzZShseXJfYm90ID09IDIwLCAxMCwgMjApKQoKIyAxNEMgY29uc3RyYWludHMKY29uLmRmIDwtIGNvbi5kZi5meChQTWVjbywgbHlyX2JvdCkKICAgICAgICAgICAgICAgIAojIGluaXRpYWwgcGFycwpJbiA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgSW4uMTAsIGlmZWxzZShseXJfYm90ID09IDIwLCBJbi4yMCwgSW4uMzApKQpnYW0gPC0gLjggIyBwYXJ0aXRpb25pbmcgY29lZgprcyA8LSBjKC4xLCAuMDAxOCkgIyBmYXN0LCBzbG93CgojIGV2YWx1YXRlIHBhcnMKaW5pLjJwcC5DMTQuZGYgPC0gcGFyLmZ4KEluLCBnYW0sIGtzKQoKIyBwbG90CkMxNC4ycHAucGxvdC5meChpbmkuMnBwLkMxNC5kZiwgY29uLmRmKQoKIyBzYXZlIHBhcnMKcGFycy5pW1twYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KV1dIDwtIGMoa3MsIGdhbSkgCmBgYAoKYGBge3IgaW5pLW1vZC1wYXJzLUFOcmYtMC0xMCwgaW5jbHVkZSA9IEZBTFNFfQojIFNpdGUvZGVwdGggaW5mbwpQTWVjbyA8LSAiQU5yZiIKbHlyX2JvdCA8LSAxMApseXJfdG9wIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCAwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgMTAsIDIwKSkKCiMgMTRDIGNvbnN0cmFpbnRzCmNvbi5kZiA8LSBjb24uZGYuZngoUE1lY28sIGx5cl9ib3QpCgojIGluaXRpYWwgcGFycwpJbiA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgSW4uMTAsIGlmZWxzZShseXJfYm90ID09IDIwLCBJbi4yMCwgSW4uMzApKQpnYW0gPC0gLjkyICMgcGFydGl0aW9uaW5nIGNvZWYKa3MgPC0gYyguMDgsIC4wMDMzKSAjIGZhc3QsIHNsb3cKCiMgZXZhbHVhdGUgcGFycwppbmkuMnBwLkMxNC5kZiA8LSBwYXIuZngoSW4sIGdhbSwga3MpCgojIHBsb3QKQzE0LjJwcC5wbG90LmZ4KGluaS4ycHAuQzE0LmRmLCBjb24uZGYpCgojIHNhdmUgcGFycwpwYXJzLmlbW3Bhc3RlMChQTWVjbywgIl8iLCBseXJfdG9wLCAiLSIsIGx5cl9ib3QpXV0gPC0gYyhrcywgZ2FtKSAKYGBgCgpgYGB7ciBpbmktbW9kLXBhcnMtQU5yZi0xMC0yMCwgaW5jbHVkZSA9IEZBTFNFfQojIFNpdGUvZGVwdGggaW5mbwpQTWVjbyA8LSAiQU5yZiIKbHlyX2JvdCA8LSAyMApseXJfdG9wIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCAwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgMTAsIDIwKSkKCiMgMTRDIGNvbnN0cmFpbnRzCmNvbi5kZiA8LSBjb24uZGYuZngoUE1lY28sIGx5cl9ib3QpCgojIGluaXRpYWwgcGFycwpJbiA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgSW4uMTAsIGlmZWxzZShseXJfYm90ID09IDIwLCBJbi4yMCwgSW4uMzApKQpnYW0gPC0gLjc4ICMgcGFydGl0aW9uaW5nIGNvZWYKa3MgPC0gYyguMSwgLjAwMjIpICMgZmFzdCwgc2xvdwoKIyBldmFsdWF0ZSBwYXJzCmluaS4ycHAuQzE0LmRmIDwtIHBhci5meChJbiwgZ2FtLCBrcykKCiMgcGxvdApDMTQuMnBwLnBsb3QuZngoaW5pLjJwcC5DMTQuZGYsIGNvbi5kZikKCiMgc2F2ZSBwYXJzCnBhcnMuaVtbcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCldXSA8LSBjKGtzLCBnYW0pIApgYGAKCmBgYHtyIGluaS1tb2QtcGFycy1BTnJmLTIwLTMwLCBpbmNsdWRlID0gRkFMU0V9CiMgU2l0ZS9kZXB0aCBpbmZvClBNZWNvIDwtICJBTnJmIgpseXJfYm90IDwtIDMwCmx5cl90b3AgPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIDAsIGlmZWxzZShseXJfYm90ID09IDIwLCAxMCwgMjApKQoKIyAxNEMgY29uc3RyYWludHMKY29uLmRmIDwtIGNvbi5kZi5meChQTWVjbywgbHlyX2JvdCkKCiMgaW5pdGlhbCBwYXJzCkluIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCBJbi4xMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIEluLjIwLCBJbi4zMCkpCmdhbSA8LSAuODUgIyBwYXJ0aXRpb25pbmcgY29lZgprcyA8LSBjKC4wOCwgLjAwMTUpICMgZmFzdCwgc2xvdwoKIyBldmFsdWF0ZSBwYXJzCmluaS4ycHAuQzE0LmRmIDwtIHBhci5meChJbiwgZ2FtLCBrcykKCiMgcGxvdApDMTQuMnBwLnBsb3QuZngoaW5pLjJwcC5DMTQuZGYsIGNvbi5kZikKCiMgc2F2ZSBwYXJzCnBhcnMuaVtbcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCldXSA8LSBjKGtzLCBnYW0pIApgYGAKCmBgYHtyIGluaS1tb2QtcGFycy1BTndmLTAtMTAsIGluY2x1ZGUgPSBGQUxTRX0KIyBTaXRlL2RlcHRoIGluZm8KUE1lY28gPC0gIkFOd2YiCmx5cl9ib3QgPC0gMTAKbHlyX3RvcCA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIDEwLCAyMCkpCgojIDE0QyBjb25zdHJhaW50cwpjb24uZGYgPC0gY29uLmRmLmZ4KFBNZWNvLCBseXJfYm90KQoKIyBpbml0aWFsIHBhcmFtZXRlcnMKSW4gPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIEluLjEwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgSW4uMjAsIEluLjMwKSkKZ2FtIDwtIC45ICMgaW5pdGlhbCB2YWx1ZQprcyA8LSBjKC4wOSwgLjAwMTcpICMgZmFzdCwgc2xvdwoKIyBldmFsdWF0ZSBwYXJzCmluaS4ycHAuQzE0LmRmIDwtIHBhci5meChJbiwgZ2FtLCBrcykKCiMgcGxvdApDMTQuMnBwLnBsb3QuZngoaW5pLjJwcC5DMTQuZGYsIGNvbi5kZikKCiMgc2F2ZSBwYXJzCnBhcnMuaVtbcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCldXSA8LSBjKGtzLCBnYW0pIApgYGAKCmBgYHtyIGluaS1tb2QtcGFycy1BTndmLTEwLTIwLCBpbmNsdWRlID0gRkFMU0V9CiMgU2l0ZS9kZXB0aCBpbmZvClBNZWNvIDwtICJBTndmIgpseXJfYm90IDwtIDIwCmx5cl90b3AgPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIDAsIGlmZWxzZShseXJfYm90ID09IDIwLCAxMCwgMjApKQoKIyAxNEMgY29uc3RyYWludHMKY29uLmRmIDwtIGNvbi5kZi5meChQTWVjbywgbHlyX2JvdCkKCiMgaW5pdGlhbCBwYXJhbWV0ZXJzCkluIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCBJbi4xMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIEluLjIwLCBJbi4zMCkpCmdhbSA8LSAuODUgIyBpbml0aWFsIHZhbHVlCmtzIDwtIGMoLjA1NSwgLjAwMTMpICMgZmFzdCwgc2xvdwoKIyBldmFsdWF0ZSBwYXJzCmluaS4ycHAuQzE0LmRmIDwtIHBhci5meChJbiwgZ2FtLCBrcykKCiMgcGxvdApDMTQuMnBwLnBsb3QuZngoaW5pLjJwcC5DMTQuZGYsIGNvbi5kZikKCiMgc2F2ZSBwYXJzCnBhcnMuaVtbcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCldXSA8LSBjKGtzLCBnYW0pIApgYGAKCmBgYHtyIGluaS1tb2QtcGFycy1BTndmLTIwLTMwLCBpbmNsdWRlID0gRkFMU0V9CiMgU2l0ZS9kZXB0aCBpbmZvClBNZWNvIDwtICJBTndmIgpseXJfYm90IDwtIDMwCmx5cl90b3AgPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIDAsIGlmZWxzZShseXJfYm90ID09IDIwLCAxMCwgMjApKQoKIyAxNEMgY29uc3RyYWludHMKY29uLmRmIDwtIGNvbi5kZi5meChQTWVjbywgbHlyX2JvdCkKCiMgaW5pdGlhbCBwYXJhbWV0ZXJzCkluIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCBJbi4xMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIEluLjIwLCBJbi4zMCkpCmdhbSA8LSAuOSAjIGluaXRpYWwgdmFsdWUKa3MgPC0gYyguMDksIC4wMDEpICMgZmFzdCwgc2xvdwoKIyBldmFsdWF0ZSBwYXJzCmluaS4ycHAuQzE0LmRmIDwtIHBhci5meChJbiwgZ2FtLCBrcykKCiMgcGxvdApDMTQuMnBwLnBsb3QuZngoaW5pLjJwcC5DMTQuZGYsIGNvbi5kZikKCiMgc2F2ZSBwYXJzCnBhcnMuaVtbcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCldXSA8LSBjKGtzLCBnYW0pIApgYGAKCmBgYHtyIGluaS1tb2QtcGFycy1CU3BwLTAtMTAsIGluY2x1ZGUgPSBGQUxTRX0KIyBTaXRlL2RlcHRoIGluZm8KUE1lY28gPC0gIkJTcHAiCmx5cl9ib3QgPC0gMTAKbHlyX3RvcCA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIDEwLCAyMCkpCgojIDE0QyBjb25zdHJhaW50cwpjb24uZGYgPC0gY29uLmRmLmZ4KFBNZWNvLCBseXJfYm90KQogICAgICAgICAgICAgICAgCiMgaW5pdGlhbCBwYXJzCkluIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCBJbi4xMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIEluLjIwLCBJbi4zMCkpCmdhbSA8LSAuNyAjIHBhcnRpdGlvbmluZyBjb2VmCmtzIDwtIGMoLjA1LCAuMDA2NSkgIyBmYXN0LCBzbG93CgojIGV2YWx1YXRlIHBhcnMKaW5pLjJwcC5DMTQuZGYgPC0gcGFyLmZ4KEluLCBnYW0sIGtzKQoKIyBwbG90CkMxNC4ycHAucGxvdC5meChpbmkuMnBwLkMxNC5kZiwgY29uLmRmKQoKIyBzYXZlIHBhcnMKcGFycy5pW1twYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KV1dIDwtIGMoa3MsIGdhbSkgCmBgYAoKYGBge3IgaW5pLW1vZC1wYXJzLUJTcHAtMTAtMjAsIGluY2x1ZGUgPSBGQUxTRX0KIyBTaXRlL2RlcHRoIGluZm8KUE1lY28gPC0gIkJTcHAiCmx5cl9ib3QgPC0gMjAKbHlyX3RvcCA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIDEwLCAyMCkpCgojIDE0QyBjb25zdHJhaW50cwpjb24uZGYgPC0gY29uLmRmLmZ4KFBNZWNvLCBseXJfYm90KQogICAgICAgICAgICAgICAgCiMgaW5pdGlhbCBwYXJzCkluIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCBJbi4xMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIEluLjIwLCBJbi4zMCkpCmdhbSA8LSAuNzUgIyBwYXJ0aXRpb25pbmcgY29lZgprcyA8LSBjKC4wNywgLjAwNDIpICMgZmFzdCwgc2xvdwoKIyBldmFsdWF0ZSBwYXJzCmluaS4ycHAuQzE0LmRmIDwtIHBhci5meChJbiwgZ2FtLCBrcykKCiMgcGxvdApDMTQuMnBwLnBsb3QuZngoaW5pLjJwcC5DMTQuZGYsIGNvbi5kZikKCiMgc2F2ZSBwYXJzCnBhcnMuaVtbcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCldXSA8LSBjKGtzLCBnYW0pIApgYGAKCmBgYHtyIGluaS1tb2QtcGFycy1CU3BwLTIwLTMwLCBpbmNsdWRlID0gRkFMU0V9CiMgU2l0ZS9kZXB0aCBpbmZvClBNZWNvIDwtICJCU3BwIgpseXJfYm90IDwtIDMwCmx5cl90b3AgPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIDAsIGlmZWxzZShseXJfYm90ID09IDIwLCAxMCwgMjApKQoKIyAxNEMgY29uc3RyYWludHMKY29uLmRmIDwtIGNvbi5kZi5meChQTWVjbywgbHlyX2JvdCkKICAgICAgICAgICAgICAgIAojIGluaXRpYWwgcGFycwpJbiA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgSW4uMTAsIGlmZWxzZShseXJfYm90ID09IDIwLCBJbi4yMCwgSW4uMzApKQpnYW0gPC0gLjU1ICMgcGFydGl0aW9uaW5nIGNvZWYKa3MgPC0gYyguMywgLjAwMykgIyBmYXN0LCBzbG93CgojIGV2YWx1YXRlIHBhcnMKaW5pLjJwcC5DMTQuZGYgPC0gcGFyLmZ4KEluLCBnYW0sIGtzKQoKIyBwbG90CkMxNC4ycHAucGxvdC5meChpbmkuMnBwLkMxNC5kZiwgY29uLmRmKQoKIyBzYXZlIHBhcnMKcGFycy5pW1twYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KV1dIDwtIGMoa3MsIGdhbSkgCmBgYAoKYGBge3IgaW5pLW1vZC1wYXJzLUJTcmYtMC0xMCwgaW5jbHVkZSA9IEZBTFNFfQojIFNpdGUvZGVwdGggaW5mbwpQTWVjbyA8LSAiQlNyZiIKbHlyX2JvdCA8LSAxMApseXJfdG9wIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCAwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgMTAsIDIwKSkKCiMgMTRDIGNvbnN0cmFpbnRzCmNvbi5kZiA8LSBjb24uZGYuZngoUE1lY28sIGx5cl9ib3QpCgojIGluaXRpYWwgcGFycwpJbiA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgSW4uMTAsIGlmZWxzZShseXJfYm90ID09IDIwLCBJbi4yMCwgSW4uMzApKQpnYW0gPC0gLjkgIyBwYXJ0aXRpb25pbmcgY29lZgprcyA8LSBjKC4xMCwgLjAwMykgIyBmYXN0LCBzbG93CgojIGV2YWx1YXRlIHBhcnMKaW5pLjJwcC5DMTQuZGYgPC0gcGFyLmZ4KEluLCBnYW0sIGtzKQoKIyBwbG90CkMxNC4ycHAucGxvdC5meChpbmkuMnBwLkMxNC5kZiwgY29uLmRmKQoKIyBzYXZlIHBhcnMKcGFycy5pW1twYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KV1dIDwtIGMoa3MsIGdhbSkgCmBgYAoKYGBge3IgaW5pLW1vZC1wYXJzLUJTcmYtMTAtMjAsIGluY2x1ZGUgPSBGQUxTRX0KIyBTaXRlL2RlcHRoIGluZm8KUE1lY28gPC0gIkJTcmYiCmx5cl9ib3QgPC0gMjAKbHlyX3RvcCA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIDEwLCAyMCkpCgojIDE0QyBjb25zdHJhaW50cwpjb24uZGYgPC0gY29uLmRmLmZ4KFBNZWNvLCBseXJfYm90KQoKIyBpbml0aWFsIHBhcnMKSW4gPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIEluLjEwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgSW4uMjAsIEluLjMwKSkKZ2FtIDwtIC45ICMgcGFydGl0aW9uaW5nIGNvZWYKa3MgPC0gYyguMDg1LCAuMDAzKSAjIGZhc3QsIHNsb3cKCiMgZXZhbHVhdGUgcGFycwppbmkuMnBwLkMxNC5kZiA8LSBwYXIuZngoSW4sIGdhbSwga3MpCgojIHBsb3QKQzE0LjJwcC5wbG90LmZ4KGluaS4ycHAuQzE0LmRmLCBjb24uZGYpCgojIHNhdmUgcGFycwpwYXJzLmlbW3Bhc3RlMChQTWVjbywgIl8iLCBseXJfdG9wLCAiLSIsIGx5cl9ib3QpXV0gPC0gYyhrcywgZ2FtKSAKYGBgCgpgYGB7ciBpbmktbW9kLXBhcnMtQlNyZi0yMC0zMCwgaW5jbHVkZSA9IEZBTFNFfQojIFNpdGUvZGVwdGggaW5mbwpQTWVjbyA8LSAiQlNyZiIKbHlyX2JvdCA8LSAzMApseXJfdG9wIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCAwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgMTAsIDIwKSkKCiMgMTRDIGNvbnN0cmFpbnRzCmNvbi5kZiA8LSBjb24uZGYuZngoUE1lY28sIGx5cl9ib3QpCgojIGluaXRpYWwgcGFycwpJbiA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgSW4uMTAsIGlmZWxzZShseXJfYm90ID09IDIwLCBJbi4yMCwgSW4uMzApKQpnYW0gPC0gLjkgIyBwYXJ0aXRpb25pbmcgY29lZgprcyA8LSBjKC4wOSwgLjAwMikgIyBmYXN0LCBzbG93CgojIGV2YWx1YXRlIHBhcnMKaW5pLjJwcC5DMTQuZGYgPC0gcGFyLmZ4KEluLCBnYW0sIGtzKQoKIyBwbG90CkMxNC4ycHAucGxvdC5meChpbmkuMnBwLkMxNC5kZiwgY29uLmRmKQoKIyBzYXZlIHBhcnMKcGFycy5pW1twYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KV1dIDwtIGMoa3MsIGdhbSkgCmBgYAoKYGBge3IgaW5pLW1vZC1wYXJzLUJTd2YtMC0xMCwgaW5jbHVkZSA9IEZBTFNFfQojIFNpdGUvZGVwdGggaW5mbwpQTWVjbyA8LSAiQlN3ZiIKbHlyX2JvdCA8LSAxMApseXJfdG9wIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCAwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgMTAsIDIwKSkKCiMgMTRDIGNvbnN0cmFpbnRzCmNvbi5kZiA8LSBjb24uZGYuZngoUE1lY28sIGx5cl9ib3QpCgojIGluaXRpYWwgcGFyYW1ldGVycwpJbiA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgSW4uMTAsIGlmZWxzZShseXJfYm90ID09IDIwLCBJbi4yMCwgSW4uMzApKQpnYW0gPC0gLjkgIyBpbml0aWFsIHZhbHVlCmtzIDwtIGMoLjEyLCAuMDA0KSAjIGZhc3QsIHNsb3cKCiMgZXZhbHVhdGUgcGFycwppbmkuMnBwLkMxNC5kZiA8LSBwYXIuZngoSW4sIGdhbSwga3MpCgojIHBsb3QKQzE0LjJwcC5wbG90LmZ4KGluaS4ycHAuQzE0LmRmLCBjb24uZGYpCgojIHNhdmUgcGFycwpwYXJzLmlbW3Bhc3RlMChQTWVjbywgIl8iLCBseXJfdG9wLCAiLSIsIGx5cl9ib3QpXV0gPC0gYyhrcywgZ2FtKSAKYGBgCgpgYGB7ciBpbmktbW9kLXBhcnMtQlN3Zi0xMC0yMCwgaW5jbHVkZSA9IEZBTFNFfQojIFNpdGUvZGVwdGggaW5mbwpQTWVjbyA8LSAiQlN3ZiIKbHlyX2JvdCA8LSAyMApseXJfdG9wIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCAwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgMTAsIDIwKSkKCiMgMTRDIGNvbnN0cmFpbnRzCmNvbi5kZiA8LSBjb24uZGYuZngoUE1lY28sIGx5cl9ib3QpCgojIGluaXRpYWwgcGFyYW1ldGVycwpJbiA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgSW4uMTAsIGlmZWxzZShseXJfYm90ID09IDIwLCBJbi4yMCwgSW4uMzApKQpnYW0gPC0gLjYgIyBpbml0aWFsIHZhbHVlCmtzIDwtIGMoLjIsIC4wMDM1KSAjIGZhc3QsIHNsb3cKCiMgZXZhbHVhdGUgcGFycwppbmkuMnBwLkMxNC5kZiA8LSBwYXIuZngoSW4sIGdhbSwga3MpCgojIHBsb3QKQzE0LjJwcC5wbG90LmZ4KGluaS4ycHAuQzE0LmRmLCBjb24uZGYpCgojIHNhdmUgcGFycwpwYXJzLmlbW3Bhc3RlMChQTWVjbywgIl8iLCBseXJfdG9wLCAiLSIsIGx5cl9ib3QpXV0gPC0gYyhrcywgZ2FtKSAKYGBgCgpgYGB7ciBpbmktbW9kLXBhcnMtQlN3Zi0yMC0zMCwgaW5jbHVkZSA9IEZBTFNFfQojIFNpdGUvZGVwdGggaW5mbwpQTWVjbyA8LSAiQlN3ZiIKbHlyX2JvdCA8LSAzMApseXJfdG9wIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCAwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgMTAsIDIwKSkKCiMgMTRDIGNvbnN0cmFpbnRzCmNvbi5kZiA8LSBjb24uZGYuZngoUE1lY28sIGx5cl9ib3QpCgojIGluaXRpYWwgcGFyYW1ldGVycwpJbiA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgSW4uMTAsIGlmZWxzZShseXJfYm90ID09IDIwLCBJbi4yMCwgSW4uMzApKQpnYW0gPC0gLjQgIyBpbml0aWFsIHZhbHVlCmtzIDwtIGMoLjEyLCAuMDAzKSAjIGZhc3QsIHNsb3cKCiMgZXZhbHVhdGUgcGFycwppbmkuMnBwLkMxNC5kZiA8LSBwYXIuZngoSW4sIGdhbSwga3MpCgojIHBsb3QKQzE0LjJwcC5wbG90LmZ4KGluaS4ycHAuQzE0LmRmLCBjb24uZGYpCgojIHNhdmUgcGFycwpwYXJzLmlbW3Bhc3RlMChQTWVjbywgIl8iLCBseXJfdG9wLCAiLSIsIGx5cl9ib3QpXV0gPC0gYyhrcywgZ2FtKSAKYGBgCgpgYGB7ciBpbmktbW9kLXBhcnMtR1JwcC0wLTEwLCBpbmNsdWRlID0gRkFMU0V9CiMgU2l0ZS9kZXB0aCBpbmZvClBNZWNvIDwtICJHUnBwIgpseXJfYm90IDwtIDEwCmx5cl90b3AgPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIDAsIGlmZWxzZShseXJfYm90ID09IDIwLCAxMCwgMjApKQoKIyAxNEMgY29uc3RyYWludHMKY29uLmRmIDwtIGNvbi5kZi5meChQTWVjbywgbHlyX2JvdCkKICAgICAgICAgICAgICAgIAojIGluaXRpYWwgcGFycwpJbiA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgSW4uMTAsIGlmZWxzZShseXJfYm90ID09IDIwLCBJbi4yMCwgSW4uMzApKQpnYW0gPC0gLjcyICMgcGFydGl0aW9uaW5nIGNvZWYKa3MgPC0gYyguMDYsIC4wMSkgIyBmYXN0LCBzbG93CgojIGV2YWx1YXRlIHBhcnMKaW5pLjJwcC5DMTQuZGYgPC0gcGFyLmZ4KEluLCBnYW0sIGtzKQoKIyBwbG90CkMxNC4ycHAucGxvdC5meChpbmkuMnBwLkMxNC5kZiwgY29uLmRmKQoKIyBzYXZlIHBhcnMKcGFycy5pW1twYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KV1dIDwtIGMoa3MsIGdhbSkgCmBgYAoKYGBge3IgaW5pLW1vZC1wYXJzLUdScHAtMTAtMjAsIGluY2x1ZGUgPSBGQUxTRX0KIyBTaXRlL2RlcHRoIGluZm8KUE1lY28gPC0gIkdScHAiCmx5cl9ib3QgPC0gMjAKbHlyX3RvcCA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIDEwLCAyMCkpCgojIDE0QyBjb25zdHJhaW50cwpjb24uZGYgPC0gY29uLmRmLmZ4KFBNZWNvLCBseXJfYm90KQogICAgICAgICAgICAgICAgCiMgaW5pdGlhbCBwYXJzCkluIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCBJbi4xMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIEluLjIwLCBJbi4zMCkpCmdhbSA8LSAuOCAjIHBhcnRpdGlvbmluZyBjb2VmCmtzIDwtIGMoLjA1LCAuMDA2KSAjIGZhc3QsIHNsb3cKCiMgZXZhbHVhdGUgcGFycwppbmkuMnBwLkMxNC5kZiA8LSBwYXIuZngoSW4sIGdhbSwga3MpCgojIHBsb3QKQzE0LjJwcC5wbG90LmZ4KGluaS4ycHAuQzE0LmRmLCBjb24uZGYpCgojIHNhdmUgcGFycwpwYXJzLmlbW3Bhc3RlMChQTWVjbywgIl8iLCBseXJfdG9wLCAiLSIsIGx5cl9ib3QpXV0gPC0gYyhrcywgZ2FtKSAKYGBgCgpgYGB7ciBpbmktbW9kLXBhcnMtR1JwcC0yMC0zMCwgaW5jbHVkZSA9IEZBTFNFfQojIFNpdGUvZGVwdGggaW5mbwpQTWVjbyA8LSAiR1JwcCIKbHlyX2JvdCA8LSAzMApseXJfdG9wIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCAwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgMTAsIDIwKSkKCiMgMTRDIGNvbnN0cmFpbnRzCmNvbi5kZiA8LSBjb24uZGYuZngoUE1lY28sIGx5cl9ib3QpCiAgICAgICAgICAgICAgICAKIyBpbml0aWFsIHBhcnMKSW4gPC0gSW4uMTAKZ2FtIDwtIC42NSAjIHBhcnRpdGlvbmluZyBjb2VmCmtzIDwtIGMoLjA5LCAuMDA0MikgIyBmYXN0LCBzbG93CgojIGV2YWx1YXRlIHBhcnMKaW5pLjJwcC5DMTQuZGYgPC0gcGFyLmZ4KEluLCBnYW0sIGtzKQoKIyBwbG90CkMxNC4ycHAucGxvdC5meChpbmkuMnBwLkMxNC5kZiwgY29uLmRmKQoKIyBzYXZlIHBhcnMKcGFycy5pW1twYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KV1dIDwtIGMoa3MsIGdhbSkgCmBgYAoKYGBge3IgaW5pLW1vZC1wYXJzLUdScmYtMC0xMCwgaW5jbHVkZSA9IEZBTFNFfQojIFNpdGUvZGVwdGggaW5mbwpQTWVjbyA8LSAiR1JyZiIKbHlyX2JvdCA8LSAxMApseXJfdG9wIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCAwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgMTAsIDIwKSkKCiMgMTRDIGNvbnN0cmFpbnRzCmNvbi5kZiA8LSBjb24uZGYuZngoUE1lY28sIGx5cl9ib3QpCgojIGluaXRpYWwgcGFycwpJbiA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgSW4uMTAsIGlmZWxzZShseXJfYm90ID09IDIwLCBJbi4yMCwgSW4uMzApKQpnYW0gPC0gLjkgIyBwYXJ0aXRpb25pbmcgY29lZgprcyA8LSBjKC4wOCwgLjAwMzEpICMgZmFzdCwgc2xvdwoKIyBldmFsdWF0ZSBwYXJzCmluaS4ycHAuQzE0LmRmIDwtIHBhci5meChJbiwgZ2FtLCBrcykKCiMgcGxvdApDMTQuMnBwLnBsb3QuZngoaW5pLjJwcC5DMTQuZGYsIGNvbi5kZikKCiMgc2F2ZSBwYXJzCnBhcnMuaVtbcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCldXSA8LSBjKGtzLCBnYW0pIApgYGAKCmBgYHtyIGluaS1tb2QtcGFycy1HUnJmLTEwLTIwLCBpbmNsdWRlID0gRkFMU0V9CiMgU2l0ZS9kZXB0aCBpbmZvClBNZWNvIDwtICJHUnJmIgpseXJfYm90IDwtIDIwCmx5cl90b3AgPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIDAsIGlmZWxzZShseXJfYm90ID09IDIwLCAxMCwgMjApKQoKIyAxNEMgY29uc3RyYWludHMKY29uLmRmIDwtIGNvbi5kZi5meChQTWVjbywgbHlyX2JvdCkKCiMgaW5pdGlhbCBwYXJzCkluIDwtIEluLjEwCmdhbSA8LSAuOSAjIHBhcnRpdGlvbmluZyBjb2VmCmtzIDwtIGMoLjA4LCAuMDAzMSkgIyBmYXN0LCBzbG93CgojIGV2YWx1YXRlIHBhcnMKaW5pLjJwcC5DMTQuZGYgPC0gcGFyLmZ4KEluLCBnYW0sIGtzKQoKIyBwbG90CkMxNC4ycHAucGxvdC5meChpbmkuMnBwLkMxNC5kZiwgY29uLmRmKQoKIyBzYXZlIHBhcnMKcGFycy5pW1twYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KV1dIDwtIGMoa3MsIGdhbSkgCmBgYAoKYGBge3IgaW5pLW1vZC1wYXJzLUdScmYtMjAtMzAsIGluY2x1ZGUgPSBGQUxTRX0KIyBTaXRlL2RlcHRoIGluZm8KUE1lY28gPC0gIkdScmYiCmx5cl9ib3QgPC0gMzAKbHlyX3RvcCA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIDEwLCAyMCkpCgojIDE0QyBjb25zdHJhaW50cwpjb24uZGYgPC0gY29uLmRmLmZ4KFBNZWNvLCBseXJfYm90KQoKIyBpbml0aWFsIHBhcnMKSW4gPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIEluLjEwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgSW4uMjAsIEluLjMwKSkKZ2FtIDwtIC41ICMgcGFydGl0aW9uaW5nIGNvZWYKa3MgPC0gYyguMywgLjAwMjgpICMgZmFzdCwgc2xvdwoKIyBldmFsdWF0ZSBwYXJzCmluaS4ycHAuQzE0LmRmIDwtIHBhci5meChJbiwgZ2FtLCBrcykKCiMgcGxvdApDMTQuMnBwLnBsb3QuZngoaW5pLjJwcC5DMTQuZGYsIGNvbi5kZikKCiMgc2F2ZSBwYXJzCnBhcnMuaVtbcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCldXSA8LSBjKGtzLCBnYW0pIApgYGAKCmBgYHtyIGluaS1tb2QtcGFycy1HUndmLTAtMTAsIGluY2x1ZGUgPSBGQUxTRX0KIyBTaXRlL2RlcHRoIGluZm8KUE1lY28gPC0gIkdSd2YiCmx5cl9ib3QgPC0gMTAKbHlyX3RvcCA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIDEwLCAyMCkpCgojIDE0QyBjb25zdHJhaW50cwpjb24uZGYgPC0gY29uLmRmLmZ4KFBNZWNvLCBseXJfYm90KQoKIyBpbml0aWFsIHBhcmFtZXRlcnMKSW4gPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIEluLjEwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgSW4uMjAsIEluLjMwKSkKZ2FtIDwtIC44ICMgcGFydGl0aW9uaW5nIGNvZWYKa3MgPC0gYyguMDc1LCAuMDA3NSkgIyBmYXN0LCBzbG93CgojIGV2YWx1YXRlIHBhcnMKaW5pLjJwcC5DMTQuZGYgPC0gcGFyLmZ4KEluLCBnYW0sIGtzKQoKIyBwbG90CkMxNC4ycHAucGxvdC5meChpbmkuMnBwLkMxNC5kZiwgY29uLmRmKQoKIyBzYXZlIHBhcnMKcGFycy5pW1twYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KV1dIDwtIGMoa3MsIGdhbSkgCmBgYAoKYGBge3IgaW5pLW1vZC1wYXJzLUdSd2YtMTAtMjAsIGluY2x1ZGUgPSBGQUxTRX0KIyBTaXRlL2RlcHRoIGluZm8KUE1lY28gPC0gIkdSd2YiCmx5cl9ib3QgPC0gMjAKbHlyX3RvcCA8LSBpZmVsc2UobHlyX2JvdCA9PSAxMCwgMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIDEwLCAyMCkpCgojIDE0QyBjb25zdHJhaW50cwpjb24uZGYgPC0gY29uLmRmLmZ4KFBNZWNvLCBseXJfYm90KQoKIyBpbml0aWFsIHBhcmFtZXRlcnMKSW4gPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIEluLjEwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgSW4uMjAsIEluLjMwKSkKZ2FtIDwtIC41ICMgcGFydGl0aW9uaW5nIGNvZWYKa3MgPC0gYyguMywgLjAwMzUpICMgZmFzdCwgc2xvdwoKIyBldmFsdWF0ZSBwYXJzCmluaS4ycHAuQzE0LmRmIDwtIHBhci5meChJbiwgZ2FtLCBrcykKCiMgcGxvdApDMTQuMnBwLnBsb3QuZngoaW5pLjJwcC5DMTQuZGYsIGNvbi5kZikKCiMgc2F2ZSBwYXJzCnBhcnMuaVtbcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCldXSA8LSBjKGtzLCBnYW0pIApgYGAKCmBgYHtyIGluaS1tb2QtcGFycy1HUndmLTIwLTMwLCBpbmNsdWRlID0gRkFMU0V9CiMgU2l0ZS9kZXB0aCBpbmZvClBNZWNvIDwtICJHUndmIgpseXJfYm90IDwtIDMwCmx5cl90b3AgPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIDAsIGlmZWxzZShseXJfYm90ID09IDIwLCAxMCwgMjApKQoKIyAxNEMgY29uc3RyYWludHMKY29uLmRmIDwtIGNvbi5kZi5meChQTWVjbywgbHlyX2JvdCkKCiMgaW5pdGlhbCBwYXJhbWV0ZXJzCkluIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCBJbi4xMCwgaWZlbHNlKGx5cl9ib3QgPT0gMjAsIEluLjIwLCBJbi4zMCkpCmdhbSA8LSAuNyAjIHBhcnRpdGlvbmluZyBjb2VmCmtzIDwtIGMoLjE1LCAuMDAyNSkgIyBmYXN0LCBzbG93CgojIGV2YWx1YXRlIHBhcnMKaW5pLjJwcC5DMTQuZGYgPC0gcGFyLmZ4KEluLCBnYW0sIGtzKQoKIyBwbG90CkMxNC4ycHAucGxvdC5meChpbmkuMnBwLkMxNC5kZiwgY29uLmRmKQoKIyBzYXZlIHBhcnMKcGFycy5pW1twYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KV1dIDwtIGMoa3MsIGdhbSkgCmBgYAoKYGBge3Igb3B0LW1vZCwgZXZhbCA9IEZBTFNFfQojIyBPcHRpbWl6ZSBtb2RlbCBwYXJzCiMgQ29zdCBmdW5jdGlvbiAoZXZhbHVhdGVzIGVycm9yIGFzIG1vZGVsIHZzLiBvYnN2LCBwZXIgRk1FIHJlcSkKIyBub3RlIHRoYXQgd2UgaGF2ZSB0byBzZXQgInBhc3MiIHRvIFRSVUUgc28gU29pbFIgbW9kZWwgZG9lc24ndCBmYWlsIChuZWcuIHJlc3ApCm1vZC5maXRzIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgocGFycy5pKSkKbW9kLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmkpLCBmdW5jdGlvbihpKSB7CiAgc3RhcnQgPC0gU3lzLnRpbWUoKQogIGNhdChwYXN0ZTAobmFtZXMocGFycy5pKVtpXSwgIiBwYXJhbWV0ZXIgZml0dGluZ1xuIikpCiAgIyBkZWZpbmUgY29zdCBmdW5jdGlvbiBmb3IgY3VycmVudCBpdGVyYXRpb24KICBtb2QuQ29zdCA8LSBmdW5jdGlvbihwYXJzKXsKICAgIG1vZGVsT3V0cHV0IDwtIG1vZEZ1bl8ycHAocGFycywgcGFzcyA9IFRSVUUpCiAgICBjb3N0MSA8LSBtb2RDb3N0KG1vZGVsID0gbW9kZWxPdXRwdXQsIG9icyA9IG9icy5idWxrLjE0Y1tbaV1dLCBzY2FsZVZhciA9IFRSVUUpCiAgICByZXR1cm4obW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMucmVzcC4xNGNbW2ldXSwgY29zdCA9IGNvc3QxKSkKICB9CiAgIyBmaXQgcGFycwogIGZpdCA8LSBtb2RGaXQoZiA9IG1vZC5Db3N0LAogICAgICAgICAgICAgICAgcCA9IHBhcnMuaVtbaV1dLAogICAgICAgICAgICAgICAgbWV0aG9kID0gJ05lbGRlci1NZWFkJywKICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAxLCAxKSwgCiAgICAgICAgICAgICAgICBsb3dlciA9IGMoMCwgMCwgMCkpCiAgZW5kIDwtIFN5cy50aW1lKCkKICBjYXQocGFzdGUwKCJ0aW1lOiAiLCBlbmQgLSBzdGFydCwgIlxuIikpCiAgcmV0dXJuKGZpdCkKfSkKCiMgc2F2ZSBvdXRwdXQKbmFtZXMobW9kLmZpdHMpIDwtIG5hbWVzKHBhcnMuaSkKc2F2ZShtb2QuZml0cywgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZEZpdF9wYXJzXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKYGBgCgpgYGB7ciByZXBvcnQtcGFyLWZpdH0KIyBsb2FkIGZpdHMKbG9hZChmaWxlID0gIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2RGaXRfcGFyc18yMDIwLTExLTA5LlJEYXRhIikKCiMgbG9vayBhdCBlc3RpbWF0ZXMKcGFycy5maXQgPC0gbWFwcGx5KHJiaW5kLCAKICAgICAgICAgICAgICAgICAgIGxhcHBseShtb2QuZml0cywgIltbIiwgMSksIAogICAgICAgICAgICAgICAgICAgcGFycy5pLCAKICAgICAgICAgICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpCnBhcnMuZml0IDwtIGxhcHBseShwYXJzLmZpdCwgZnVuY3Rpb24oZGYpIHsKICBkZiA8LSBkYXRhLmZyYW1lKGRmKQogIGNvbG5hbWVzKGRmKSA8LSBjKCJrZmFzdCIsICJrc2xvdyIsICJnYW0iKQogIGRmJGVzdCA8LSBjKCJmaXQiLCAiaW5pdCIpCiAgcmV0dXJuKGRmKQp9KQpuYW1lcyhwYXJzLmZpdCkgPC0gbmFtZXMocGFycy5pKQoKIyBzdW1tYXJ5IG9mIGZpdHMKcGFycy5maXQuc3VtIDwtIGxhcHBseShtb2QuZml0cywgZnVuY3Rpb24oeCkgc3VtbWFyeSh4KSkKbmFtZXMocGFycy5maXQuc3VtKSA8LSBuYW1lcyhwYXJzLmZpdCkKCiMgYmluZCBmaXR0ZWQgcGFyYW1ldGVycyBpbnRvIGRhdGEgZnJhbWUgZm9yIHBsb3R0aW5nL3N1bW1hcml6aW5nCnBhcnMuZml0LmRmIDwtIGJpbmRfcm93cyhwYXJzLmZpdCkKcGFycy5maXQuZGYkUE1lY29fZGVwdGggPC0gcmVwKG5hbWVzKHBhcnMuaSksIGVhY2ggPSAyKQpwYXJzLmZpdC5kZiRQTSA8LSBzdWJzdHIocGFycy5maXQuZGYkUE1lY29fZGVwdGgsIHN0YXJ0ID0gMSwgc3RvcCA9IDIpCnBhcnMuZml0LmRmJGVjbyA8LSBzdWJzdHIocGFycy5maXQuZGYkUE1lY29fZGVwdGgsIHN0YXJ0ID0gMywgc3RvcCA9IDQpCnBhcnMuZml0LmRmJGRlcHRoIDwtIHN1YnN0cihwYXJzLmZpdC5kZiRQTWVjb19kZXB0aCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IDYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IGxlbmd0aChwYXJzLmZpdC5kZiRQTWVjb19kZXB0aCkpCgojIHN1bW1hcml6ZSBieSBQTSwgZGVwdGgKcGFycy5maXQuZGYuUE0gPC0gc3VwcHJlc3NNZXNzYWdlcyhwYXJzLmZpdC5kZiAlPiUKICBmaWx0ZXIoZXN0ID09ICJmaXQiKSAlPiUKICBzZWxlY3QoIWMoZXN0LCBQTWVjb19kZXB0aCwgZWNvKSkgJT4lCiAgZ3JvdXBfYnkoUE0sIGRlcHRoKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSAlPiUKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBkaWdpdHMgPSAyKSkKIyBzdW1tYXJpemUgYnkgRUNPLCBkZXB0aApwYXJzLmZpdC5kZi5lY28gPC0gc3VwcHJlc3NNZXNzYWdlcyhwYXJzLmZpdC5kZiAlPiUKICBmaWx0ZXIoZXN0ID09ICJmaXQiKSAlPiUKICBzZWxlY3QoIWMoZXN0LCBQTWVjb19kZXB0aCwgUE0pKSAlPiUKICBncm91cF9ieShlY28sIGRlcHRoKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSAlPiUKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBkaWdpdHMgPSAyKSkKCmtuaXRyOjprYWJsZShwYXJzLmZpdC5kZi5QTSwKICAgICAgICAgICAgIGNhcHRpb24gPSAiTWVhbiBwYXJhbWV0ZXIgZXN0aW1hdGVzIGJ5IHBhcmVudCBtYXRlcmlhbCAoUE0pIiwKICAgICAgICAgICAgIGFsaWduID0gImMiKQprbml0cjo6a2FibGUocGFycy5maXQuZGYuZWNvLAogICAgICAgICAgICAgY2FwdGlvbiA9ICJNZWFuIHBhcmFtZXRlciBlc3RpbWF0ZXMgYnkgZWNvc3lzdGVtIChlY28pIiwKICAgICAgICAgICAgIGFsaWduID0gImMiKQoKIyMgcGxvdCBwYXJzCiMgMC0xMApwYXJzLmZpdC5kZiAlPiUKICBmaWx0ZXIoZXN0ID09ICJmaXQiLCBkZXB0aCA9PSAiMC0xMCIpICU+JQogIHBpdm90X2xvbmdlcighKGVzdDpkZXB0aCksIG5hbWVzX3RvID0gInBhciIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JQogIG11dGF0ZShQTSA9IGZhY3RvcihQTSksCiAgICAgICAgIGVjbyA9IGZhY3RvcihlY28sIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBhciwgdmFsdWUsIGNvbG9yID0gUE0sIHNoYXBlID0gZWNvKSkgKwogIGdlb21faml0dGVyKHNpemUgPSA0KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAicGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICBmYWNldF93cmFwKC4gfiBwYXIsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdndGl0bGUoIm1vZEZpdCBwYXJzIDAtMTAgY20iKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgMTAtMjAKcGFycy5maXQuZGYgJT4lCiAgZmlsdGVyKGVzdCA9PSAiZml0IiwgZGVwdGggPT0gIjEwLTIwIikgJT4lCiAgcGl2b3RfbG9uZ2VyKCEoZXN0OmRlcHRoKSwgbmFtZXNfdG8gPSAicGFyIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lCiAgbXV0YXRlKFBNID0gZmFjdG9yKFBNKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGVjbywgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIGdncGxvdCguLCBhZXMocGFyLCB2YWx1ZSwgY29sb3IgPSBQTSwgc2hhcGUgPSBlY28pKSArCiAgZ2VvbV9qaXR0ZXIoc2l6ZSA9IDQpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogIGZhY2V0X3dyYXAoLiB+IHBhciwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2d0aXRsZSgibW9kRml0IHBhcnMgMTAtMjAgY20iKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgMjAtMzAKcGFycy5maXQuZGYgJT4lCiAgZmlsdGVyKGVzdCA9PSAiZml0IiwgZGVwdGggPT0gIjIwLTMwIikgJT4lCiAgcGl2b3RfbG9uZ2VyKCEoZXN0OmRlcHRoKSwgbmFtZXNfdG8gPSAicGFyIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lCiAgbXV0YXRlKFBNID0gZmFjdG9yKFBNKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGVjbywgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIGdncGxvdCguLCBhZXMocGFyLCB2YWx1ZSwgY29sb3IgPSBQTSwgc2hhcGUgPSBlY28pKSArCiAgZ2VvbV9qaXR0ZXIoc2l6ZSA9IDQpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogIGZhY2V0X3dyYXAoLiB+IHBhciwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2d0aXRsZSgibW9kRml0IHBhcnMgMjAtMzAgY20iKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciBmaXQtc29jLXN0b2N9CiMjIGFkanVzdCBpbnB1dHMgdG8gbWF0Y2ggbW9kZWxlZCBzdG9ja3MKIyBmdW5jdGlvbiBmb3IgY2FsY3VsYXRpbmcgZml0dGVkIFNPQyBzdG9ja3Mgd2l0aGluIGxhcmdlciBmdW5jdGlvbgpzb2MuZnggPC0gZnVuY3Rpb24oa3MsIGdhbSwgSW4pIHsKICBjb2xTdW1zKC0xICogc29sdmUoLTEgKiBkaWFnKGtzKSkgJSolIGMoSW4gKiBnYW0sIEluICogKDEgLSBnYW0pKSkKfQoKaW4uZml0LmZ4IDwtIGZ1bmN0aW9uKGtzLCBnYW0sIGluaXRpYWxJbiwgU09DKSB7CiAgIyBzZXF1ZW5jZSBvZiBwb3NzaWJsZSBpbnB1dCB2YWx1ZXMKICBpZiAgKFNPQyA8IHNvYy5meChrcywgZ2FtLCBpbml0aWFsSW4pKSB7CiAgICBpbnMgPC0gc2VxKC4wMSwgCiAgICAgICAgICAgICAgIGluaXRpYWxJbiwgCiAgICAgICAgICAgICAgIC4wMSkKICAgIH0gZWxzZSB7CiAgICAgIGlucyA8LSBzZXEoaW5pdGlhbEluLCAKICAgICAgICAgICAgICAgICBTT0MsIAogICAgICAgICAgICAgICAgIC4wMSkKICAgIH0KICAjIG1vZGVsZWQgc3RvY2tzCiAgc29jX21vZCA8LSBsYXBwbHkoc2VxX2Fsb25nKGlucyksIGZ1bmN0aW9uKGopIHsKICAgIHNvYy5meChrcywgZ2FtLCBpbnNbal0pCiAgfSkKICBpeCA8LSB3aGljaC5taW4oYWJzKHVubGlzdChzb2NfbW9kKSAtIFNPQykpCiAgcmV0dXJuKGluc1tpeF0pCn0KCiMgcnVuIGZ1bmN0aW9uCmluLmZpdCA8LSBsYXBwbHkoc2VxX2Fsb25nKGtzLmxzKSwgZnVuY3Rpb24oaSkgewogIFBNZWNvX2RlcHRoIDwtIG5hbWVzKGtzLmxzKVtpXQogIFNPQyA8LSBjc29jLjE5LjBfMzBbW1BNZWNvX2RlcHRoXV1bICwibHlyX3NvYyJdCiAgaWYgKGdyZXBsKCIwLTEwIiwgUE1lY29fZGVwdGgpKSB7CiAgICByZXR1cm4oaW4uZml0LmZ4KGtzLmxzW1tpXV0sIGdhbS5sc1tbaV1dLCBJbi4xMCwgU09DKSkKICB9IGVsc2UgaWYgKGdyZXBsKCIxMC0yMCIsIFBNZWNvX2RlcHRoKSkgewogICAgcmV0dXJuKGluLmZpdC5meChrcy5sc1tbaV1dLCBnYW0ubHNbW2ldXSwgSW4uMjAsIFNPQykpCiAgfSBlbHNlIHsKICAgIHJldHVybihpbi5maXQuZngoa3MubHNbW2ldXSwgZ2FtLmxzW1tpXV0sIEluLjMwLCBTT0MpKQogIH0KfSkKCiMgQ2FsYyBtb2RlbGVkIHN0b2NrcyBhbmQgY29tcGFyZSB3aXRoIG1lYXN1cmVkIHN0b2Nrcwptb2Quc29jcy5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGtzLmxzKSwgZnVuY3Rpb24oaSkgewogIEEgPC0gLTEgKiBkaWFnKGtzLmxzW1tpXV0pCiAgcmV0dXJuKGNvbFN1bXMoLTEgKiBzb2x2ZShBKSAlKiUgYyhpbi5maXRbW2ldXSAqIGdhbS5sc1tbaV1dLCBpbi5maXRbW2ldXSAqICgxIC0gZ2FtLmxzW1tpXV0pKSkpCn0pCnNvY3MubHMgPC0gbWFwcGx5KGNiaW5kLAogICAgICAgICAgICAgICAgICBjc29jLjE5LjBfMzAsIAogICAgICAgICAgICAgICAgICBtb2Quc29jcy5scywgCiAgICAgICAgICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpCmBgYAoKYGBge3IgcGxvdC1vcHQtbW9kcy0wLTEwfQojIFJlcnVuIG1vZGVscyBhbmQgcGxvdCByZXN1bHRzIHdpdGggZml0dGVkIHBhcmFtZXRlcnMKa3MubHMgPC0gbGFwcGx5KGxhcHBseShwYXJzLmZpdCwgIlsiLCAxLCApLCBmdW5jdGlvbihkZikgdW5saXN0KGRmWyAsIGMoMToyKV0pKQpnYW0ubHMgPC0gbGFwcGx5KGxhcHBseShwYXJzLmZpdCwgIlsiLCAxLCApLCBmdW5jdGlvbihkZikgdW5saXN0KGRmWyAsIDNdKSkKCiMgcmV0dXJuIGRhdGEgZnJhbWVzIG9mIG1vZGVsIGZpdHMKVHdvcHAuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKGtzLmxzKSwgZnVuY3Rpb24oaSkgewogIHBhci5meChpbi5maXRbW2ldXSwgZ2FtLmxzW1tpXV0sIGtzLmxzW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSkKfSkKClR3b3BwLmZpdHMucGxvdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhUd29wcC5maXRzKSwgZnVuY3Rpb24oaSkgewogIFBNZWNvIDwtIHN1YnN0cihuYW1lcyhwYXJzLmZpdClbaV0sIDEsIDQpCiAgbHlyX2JvdCA8LSBzdWJzdHIobmFtZXMocGFycy5maXQpW2ldLCBuY2hhcihuYW1lcyhwYXJzLmZpdClbaV0pIC0gMSwgbmNoYXIobmFtZXMocGFycy5maXQpW2ldKSkKICBseXJfdG9wIDwtIGlmZWxzZShseXJfYm90ID09IDEwLCAwLCBpZmVsc2UobHlyX2JvdCA9PSAyMCwgMTAsIDIwKSkKICBjb24uZGYgPC0gY29uLmRmLmZ4KFBNZWNvLCBseXJfYm90KQogIHBsb3QuZGYgPC0gcmJpbmQoVHdvcHAuZml0c1tbaV1dLCAKICAgICAgICAgICAgICAgICAgIHBhci5meChpZmVsc2UobHlyX2JvdCA9PSAxMCwgSW4uMTAsIGlmZWxzZShseXJfYm90ID09IDIwLCBJbi4yMCwgSW4uMzApKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmlbW2ldXVszXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pW1tpXV1bMToyXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFKSkKICBwbG90LmRmJGVzdCA8LSBmYWN0b3IoYyhyZXAoImZpdHRlZCIsIG5yb3coVHdvcHAuZml0c1tbaV1dKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgiaW5pdGlhbCIsIG5yb3coVHdvcHAuZml0c1tbaV1dKSkpKQogIHJldHVybihwbG90LmRmICU+JQogICAgICAgICAgIGZpbHRlcihwb29sID09ICJidWxrIEMiIHwgcG9vbCA9PSAicmVzcGlyYXRpb24iIHwgcG9vbCA9PSAiYXRtIikgJT4lCiAgICAgICAgICAgIyBmaWx0ZXIoZXN0ID09ICJmaXR0ZWQiKSAlPiUKICAgICAgICAgICBnZ3Bsb3QoLiwgYWVzKHllYXJzLCBkMTRDLCBjb2xvciA9IHBvb2wpKSArCiAgICAgICAgICAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IGVzdCkpICsKICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGRhdGEgPSBjb24uZGYsCiAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IFllYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1pbiA9IGQxNGNfbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IGQxNGNfdSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBwb29sKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC4xLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKwogICAgICAgICAgIGdlb21fcG9pbnQoZGF0YSA9IGNvbi5kZiwgYWVzKFllYXIsIGQxNGMsIGNvbG9yID0gcG9vbCksIHNpemUgPSAzKSArCiAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgICAgICAgICAgbmFtZSA9ICJNb2RlbCBwb29sIiwKICAgICAgICAgICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAiYnVsayBDIiA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJmYXN0IiA9ICIjRDgxQjYwIiwKICAgICAgICAgICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciKSkgKwogICAgICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDE5NTAsIDIwMjIpKSArCiAgICAgICAgICAgZ2d0aXRsZShwYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90LCAiIDJwcCIpKSArCiAgICAgICAgICAgeGxhYigiWWVhciIpICsKICAgICAgICAgICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogICAgICAgICAgIHRoZW1lX2J3KCkgKwogICAgICAgICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpKQp9KQpUd29wcC5maXRzLnBsb3RzCmBgYAoKYGBge3IgTUNNQy1maXRzfQojIHRoZSBmb2xsb3dpbmcgLlJEYXRhIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHNjcmlwdCAic3JhLXRzL3NvdXJjZS9zcmEtdHMtbWNtYy1iYXllcy5SIgojIGxvYWQoZmlsZSA9ICIuLi9kYXRhL2Rlcml2ZWQvYmF5ZXMtcGFyLWZpdC0yMDIwLTExLTA2L2JheWVzX2ZpdF8ycHAtNTAwMGl0ci5SRGF0YSIpCiMgcGxvdCBwYXJhbWV0ZXIgY29udmVyZ2VuY2UKcGxvdChiYXllc19maXRfMnBwW1sxXV0pCgojIyBsb29rIGF0IG1vZGVsIHBlcmZvcm1hbmNlCnBhcnMuYmF5ZXMuZGYgPC0gYmluZF9yb3dzKGxhcHBseShzZXFfYWxvbmcoYmF5ZXNfZml0XzJwcCksIGZ1bmN0aW9uKGkpIHsKICBkZiA8LSBkYXRhLmZyYW1lKGsxID0gdW5pcXVlKGJheWVzX2ZpdF8ycHBbW2ldXVtbInBhcnMiXV1bLCAxXSksCiAgICAgICAgICAgICAgICAgICBrMiA9IHVuaXF1ZShiYXllc19maXRfMnBwW1tpXV1bWyJwYXJzIl1dWywgMl0pLAogICAgICAgICAgICAgICAgICAgZ2FtID0gdW5pcXVlKGJheWVzX2ZpdF8ycHBbW2ldXVtbInBhcnMiXV1bLCAzXSkpCiAgZGYgPC0gY2JpbmQoUE1lY29fZGVwdGggPSByZXAobmFtZXMocGFycy5maXQpW2ldKSwgCiAgICAgICAgICAgICAgZGYpCn0pKQpwYXJzLmJheWVzLmRmJFBNIDwtIGZhY3RvcihzdWJzdHIocGFycy5iYXllcy5kZiRQTWVjb19kZXB0aCwgMSwgMikpCnBhcnMuYmF5ZXMuZGYkZWNvIDwtIGZhY3RvcihzdWJzdHIocGFycy5iYXllcy5kZiRQTWVjb19kZXB0aCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpCiMgc3VtbWFyeShsbShrMiB+IFBNLCBwYXJzLmJheWVzLmRmKSkKIyBzdW1tYXJ5KGxtKGsxIH4gZWNvLCBwYXJzLmJheWVzLmRmKSkKCiMgYmVzdCBwYXIgc2V0CmJlc3RQYXJzLmJheWVzLmxzIDwtIGxhcHBseShiYXllc19maXRfMnBwLCBmdW5jdGlvbih4KSB7CiAgcm91bmQoZGF0YS5mcmFtZShrMSA9IHgkYmVzdHBhclsxXSwKICAgICAgICAgICAgICAgICAgIGsyID0geCRiZXN0cGFyWzJdLAogICAgICAgICAgICAgICAgICAgZ2FtID0geCRiZXN0cGFyWzNdKSwKICAgICAgICA0KQp9KQpiZXN0UGFycy5iYXllcy5kZiA8LSBjYmluZChQTSA9IHJlcChjKCJBTiIsICJCUyIsICJHUiIpLCBlYWNoID0gMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjbyA9IHJlcChjKCJwcCIsICJyZiIsICJ3ZiIpLCAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggPSByZXAoIjAtMTAiLCA5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZF9yb3dzKGJlc3RQYXJzLmJheWVzLmxzKSkKCiMgc3VtbWFyaXplIGJ5IFBNCnBhcnMuYmF5ZXMuUE0gPC0gYmVzdFBhcnMuYmF5ZXMuZGYgJT4lCiAgc2VsZWN0KCFjKGVjbywgZGVwdGgpKSAlPiUKICBncm91cF9ieShQTSkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSkgJT4lCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZvcm1hdCwgZGlnaXRzID0gMykKIyBzdW1tYXJpemUgYnkgRUNPCnBhcnMuYmF5ZXMuZWNvIDwtIGJlc3RQYXJzLmJheWVzLmRmICU+JQogIHNlbGVjdCghYyhQTSwgZGVwdGgpKSAlPiUKICBncm91cF9ieShlY28pICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpICU+JQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIGRpZ2l0cyA9IDMpCgojIHBsb3QgYmVzdCBwYXJzCmJlc3RQYXJzLmJheWVzLmRmICU+JQogIHBpdm90X2xvbmdlcighKFBNOmRlcHRoKSwgbmFtZXNfdG8gPSAicGFyIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lCiAgbXV0YXRlKFBNID0gZmFjdG9yKFBNKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGVjbywgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIGdncGxvdCguLCBhZXMocGFyLCB2YWx1ZSwgY29sb3IgPSBQTSwgc2hhcGUgPSBlY28pKSArCiAgZ2VvbV9qaXR0ZXIoc2l6ZSA9IDQpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogIGZhY2V0X3dyYXAoLiB+IHBhciwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgcGxvdCBhY2NlcHRlZCBwYXJzIGJ5IFBNIGFuZCB0aGVuIGJ5IGVjbwpwYXJzLmJheWVzLmRmICU+JQogIHBpdm90X2xvbmdlcighYyhQTSwgZWNvLCBQTWVjb19kZXB0aCksIG5hbWVzX3RvID0gInBhciIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JQogIG11dGF0ZShQTSA9IGZhY3RvcihQTSksCiAgICAgICAgIGVjbyA9IGZhY3RvcihlY28sIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBhciwgdmFsdWUsIGZpbGwgPSBQTSkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogIGZhY2V0X3dyYXAoLiB+IHBhciwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKcGFycy5iYXllcy5kZiAlPiUKICBwaXZvdF9sb25nZXIoIWMoUE0sIGVjbywgUE1lY29fZGVwdGgpLCBuYW1lc190byA9ICJwYXIiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUKICBtdXRhdGUoUE0gPSBmYWN0b3IoUE0pLAogICAgICAgICBlY28gPSBmYWN0b3IoZWNvLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhwYXIsIHZhbHVlLCBmaWxsID0gZWNvKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBmYWNldF93cmFwKC4gfiBwYXIsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYA==